Как передать параметр в xslt, который можно использовать в xsl: key? - PullRequest
1 голос
/ 26 января 2011

Этот XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="paramvalue" />
  <xsl:key name="test" match="$paramvalue" use="generate-id()" />

  <!-- template rules -->
</xsl:stylesheet>

Сбой, потому что вы не можете иметь значение параметра в атрибуте match xsl:key.Есть ли способ сделать это, кроме изменения xslt на лету?

Ответы [ 2 ]

2 голосов
/ 26 января 2011

Как передать параметр в xslt, который можно использовать в ключе xsl:

Для этого используйте XSLT 2.0.

В XSLT 1.0 «Ошибка в значении атрибута use или атрибута match, содержащего VariableReference ». согласно спецификации

Это ограничение было введено в спецификации с целью предотвращения цепочки циклических ссылок.

Есть лиЕсть ли способ сделать это, кроме изменения xslt на лету?

Да, ваш код XSLT может сгенерировать новую таблицу стилей xslt , которая использует конкретное значение параметра в определении ключа.

Или, если значения параметра относятся к конечному набору, у вас могут быть ключи, определенные для каждого возможного значения, - и сам параметрбудет содержать имя ключа для использования - обратите внимание, что аргумент имени ключа функции key() может быть любым выражением, включая ссылки на переменные.

0 голосов
/ 27 января 2011

Во-первых, это странный реквизит, потому что почти каждый раз, когда хочется узнать, с какими узлами совпадает ключ.Но кроме этого, и отличный ответ @ Dimitre (используйте XSLT 2.0), вы можете использовать и внешний источник ввода в качестве параметра с document() функцией.

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="Key"
             match="*[name() = document('param.xml')/*/param]"
             use="generate-id()"/>
    <xsl:template match="text()"/>
    <xsl:template match="*[key('Key',generate-id())]">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

С этимвход (также известный как 'param.xml'):

<root>
    <param>data</param>
    <data>something</data>
</root>

Выход:

<data>something</data>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...