Что не так с моим ?

#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:

Я вижу две проблемы:

  1. Вы не можете использовать ссылку на переменную или параметр в шаблоне соответствия в XSLT 1.0
  2. Вам не нужно окружение '{...}' при ссылке на ваш параметр в предикате. (Вы, вероятно, путаете это с шаблоном значения атрибута.) Используйте это вместо: 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…