Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > XSL. Значение переменной внедрить в строку


Автор: Compositum 21.3.2012, 15:18
Это работает:
Код

<xsl:variable name="resVar" select="document('./resources/ru-RU.xml')"/>

но я хочу имя локализации вынести в отдельную переменную. Переписываю код так:
Код

<body> 
<!--Локализация-->
<xsl:variable name="localization" select="'ru-RU'"/>
<!--Формирую строку относительного пути-->
<xsl:variable name="pathString">
    ./resources/<xsl:value-of select="$localization"/>.xml
</xsl:variable>
<!--Отображаю значение (для тестирования)-->
<p><xsl:value-of select="$pathString"/></p>

<!--Как значение переменной pathString передать в качестве параметра функции document???-->
<xsl:variable name="resVar" select="document('./resources/{$localization}.xml')"/>



Этот код не работает. Как правильно в параметре document указать нужное мне значение?

Автор: diadiavova 21.3.2012, 15:54
Используй функцию concat

Автор: Compositum 21.3.2012, 16:09
Цитата(diadiavova @ 21.3.2012,  15:54)
Используй функцию concat

а как быть с символом ' (апостроф)? Он ведь должен присутствовать в строке...

Автор: diadiavova 21.3.2012, 16:13
Ну в крайнем случае, в отдельную переменную его забей.

Автор: Compositum 21.3.2012, 16:17
Цитата(diadiavova @ 21.3.2012,  16:13)
Ну в крайнем случае, в отдельную переменную его забей.

вот извращение-то... :(

Я пробовал так:
Код

<!--Локализация-->
<xsl:variable name="localization" select="'ru-RU'"/>
<!--Формирую строку относительного пути-->
<xsl:variable name="pathString">
    ./resources/<xsl:value-of select="$localization"/>.xml
</xsl:variable>
<!--Отображаю значение (для тестирования)-->
<p><xsl:value-of select="$pathString"/></p>

<!--Как значение переменной pathString передать в качестве параметра функции document???-->
<xsl:variable name="resVar" select="concat('document(&quot;', $pathString,  '&quot;)')"/>

не работает. Ошибка:
Код

Выражение не возвращает узел DOM. -->$resVar/<--resources/strings/string[@name='libraryType']


Добавлено @ 16:28
проблема в том, что строка кода
Код

<xsl:value-of select="concat('document(&quot;', $pathString,  '&quot;)')"/>

генерирует такой результат:
Код

document(" ./resources/ru-RU.xml ")

содержимое кавычек начинается с пробела и заканчивается пробелом. Эти пробелы XSL добавляет сам, хотя я их не указываю... Если убрать пробелы - всё будет работать. Но блин как их убрать? Какого х.. они вообще появляются...

Автор: diadiavova 21.3.2012, 16:36
Цитата(Compositum @  21.3.2012,  17:17 Найти цитируемый пост)
Но блин как их убрать?

normalize-space

Автор: Compositum 21.3.2012, 16:40
Цитата(diadiavova @ 21.3.2012,  16:36)
Цитата(Compositum @  21.3.2012,  17:17 Найти цитируемый пост)
Но блин как их убрать?

normalize-space

и каким макаром его прикрутить к указанному мною выражению? Ведь пробелы возникают внутри функции concat.

Автор: diadiavova 21.3.2012, 16:43
Какая разница где они возникают? Функция возвращает значение, это значение и передавай другой функции. Это в любом языке будет работать одинаково.

Автор: Compositum 21.3.2012, 16:45
Цитата(diadiavova @ 21.3.2012,  16:43)
Какая разница где они возникают? Функция возвращает значение, это значение и передавай другой функции. Это в любом языке будет работать одинаково.

ок. можешь показать на примере моей строки? Либо я чего-то не понял, либо у тебя не получится это сделать. У меня уже голова квадратная с этим XSL... :((((

Добавлено через 7 минут и 1 секунду
Вопрос снят. Получилось:
Код

<xsl:value-of select="concat('document(&quot;',normalize-space($pathString),'&quot;)')"/>

Я думал, что concat добавляет пробелы ПОСЛЕ КАЖДОГО АРГУМЕНТА. А оказалось, что он лепит их ВОКРУГ ПЕРЕМЕННОЙ $pathString.

Автор: diadiavova 21.3.2012, 16:53
Ну вот у тебя лишние пробелы выдает строка
Код

<xsl:value-of select="concat('document(&quot;', $pathString,  '&quot;)')"/>
Просто оборачиваешь ее в эту функцию
Код

<xsl:value-of select="normalize-space(concat('document(&quot;', $pathString,  '&quot;)'))"/>
Хотя, если честно, мне не очень понятно зачем делать так 
Код

concat('document(&quot;', $pathString,  '&quot;)')
. Если брать первоначальную строку
Код

 document('./resources/{$localization}.xml')
то это должно было выглядеть как-то так наверно
Код

document(concat('./resources/', $localization, '.xml')
А то, что у тебя мне вообще не понятно и как это работает - тоже. Но если работает, то нормалайз-спейс должна помочь

Автор: Compositum 21.3.2012, 17:03
неа. указанный тобой вариант не рабочий.
1. параметр функции document должен быть обособлен кавычками или апострофом.
2. в твоём примере косяк со скобками.

я подправил твой вариант так:
Код

<xsl:value-of select="document(concat('&apos;./resources/', normalize-space($localization), '.xml&apos;'))"/>

но и он не заработал :(

Автор: Compositum 21.3.2012, 17:29
Корректно работает такой вариант:
Код

<xsl:variable name="resVar" select="document(concat('./resources/', normalize-space($localization), '.xml'))"/>

но если в имени пути содержатся пробелы - работать перестанет. Приходится все пробелы заменять на %20. Функция replace появилась только в XSL 2.0, т.о в XSL 1.0 придётся изобретать велосипед...


Автор: diadiavova 22.3.2012, 09:54
Цитата(Compositum @  21.3.2012,  18:03 Найти цитируемый пост)
но и он не заработал :( 

Честно говоря только сегодня на свежую голову до меня дошло, на кой ляд ты туда столько апострофов напихал. Функции надо передавать строку, а не строку с апострофами, апострофы здесь - элементы языка и служат для создания текстовых литералов, а ты передаешь апострофы функции. Естественно это не заработает.
Цитата(Compositum @  21.3.2012,  18:29 Найти цитируемый пост)
Корректно работает такой вариант:

Честно говоря, я вообще понять не могу, откуда у тебя там пробелы берутся. Можешь точно написать, как ты переменную объявляешь?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)