#xslt #parameters #params
#xslt #параметры
Вопрос:
У меня есть xsl:param
, который я пытаюсь использовать для сопоставления шаблона с атрибутом. Судя по всему, что я нашел здесь и в Интернете, я делаю это правильно. Однако мой вывод пустой.
Вот мой xslt
<xsl:param name="strm_name">main</xsl:param>
<xsl:template match="stream[@name='{$strm_name}']"></xsl:template>
Если я жестко запрограммирую вызов param в «main», это работает просто отлично.
Вот XML-тег, с которым я пытаюсь сопоставить..
<doc><stream name="main"></stream></doc>
Любая помощь очень ценится!
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться, как выглядит ваш исходный XML-файл? Без этого довольно сложно выяснить, что пошло не так…
2. Это XSLT 1.0? Если это так, вы не можете использовать ссылку на переменную в шаблоне сопоставления.
3. Я добавил исходный XML-тег, с которым пытаюсь сопоставить.
4. @lwburk Я использую 1.0, но в этом случае я не могу использовать переменную. Я должен использовать параметры из-за среды, которую я должен использовать для преобразования.
5. Вы также не можете использовать параметр в шаблоне соответствия. Смотрите мой ответ.
Ответ №1:
Я вижу две проблемы:
- Вы не можете использовать ссылку на переменную или параметр в шаблоне соответствия в XSLT 1.0
- Вам не нужно окружение
'{...}'
при ссылке на ваш параметр в предикате. (Вы, вероятно, путаете это с шаблоном значения атрибута.) Используйте это вместо:stream[@name=$strm_name]
Возможным решением проблемы № 1 является выбор только тех элементов, которые соответствуют критериям, контролируемым вашим параметром. (Вы можете ссылаться на параметр в выражении select).
Например, эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:param name="strm_name" select="'main'"/>
<xsl:template match="/">
<xsl:apply-templates select="/*/stream[@name=$strm_name]" />
</xsl:template>
<xsl:template match="stream">
<xsl:apply-templates />
<xsl:text>/</xsl:text>
</xsl:template>
</xsl:stylesheet>
Применяется к этому документу:
<root>
<stream name="main">1</stream>
<stream name="other">2</stream>
<stream name="main">3</stream>
<stream name="main">4</stream>
<stream name="other">5</stream>
<stream name="other">6</stream>
</root>
…соответствует только нужным узлам. Вывод:
1/3/4/
Комментарии:
1. Это была моя проблема: поток [@name=$strm_name]. Я удалил {‘…’}, и он работает отлично! Спасибо!! Ура синтаксису! 😉
2. 1 Правильно. Подтвердите тот факт, что вы можете сделать это в XSLT 2.0 , согласно комментарию OP…