Использовать XSL для создания динамического XSL, который выполняется в том же скрипте?

Я хочу динамически создавать переменные с динамическими именами для последующего использования в моем преобразовании, но для этого мне нужно динамически генерировать XSL, а затем запускать его в том же сценарии.

Это всего лишь грубый пример псевдокода того, что я ищу.

      <xsl:for-each select="//constants/constant" >
        <xsl:variable >
            <xsl:attribute name="name">
              <xsl:value-of select="@name"/>
            </xsl:attribute>
          <xsl:attribute name="select">
            <xsl:value-of select="@value"/>
          </xsl:attribute>
        </xsl:variable>
      </xsl:for-each>

Могу ли я использовать XSL для динамического создания XSL для последующего запуска в том же сценарии?

Примечание: наш XML преобразуется с помощью пакетного процесса, запускающего механизм преобразования CL XSL; поэтому просто ссылаться на таблицу стилей XSL в документе XSL нельзя.


person Frank Rosario    schedule 10.12.2008    source источник


Ответы (2)



XSLT имеет специальную встроенную функцию, поддерживающую создание вывода, который сам является XSLT.

Это директива XSLT <xsl:namespace-alias>.

Согласно спецификации XSLT 1.0 сильный>.:

"

<!-- Category: top-level-element -->
<xsl:namespace-alias
  stylesheet-prefix = prefix | "#default"
  result-prefix = prefix | "#default" />

Таблица стилей может использовать элемент xsl:namespace-alias, чтобы объявить, что один URI пространства имен является псевдонимом для другого URI пространства имен. Когда буквальный URI пространства имен объявлен псевдонимом для другого URI пространства имен, тогда URI пространства имен в результирующем дереве будет URI пространства имен, псевдонимом которого является буквальный URI пространства имен, а не сам буквальный URI пространства имен. Элемент xsl:namespace-alias объявляет, что URI пространства имен, связанный с префиксом, указанным атрибутом stylesheet-prefix, является псевдонимом для URI пространства имен, связанного с префиксом, указанным атрибутом result-prefix. Таким образом, атрибут stylesheet-prefix указывает URI пространства имен, который будет отображаться в таблице стилей, а атрибут result-prefix указывает соответствующий URI пространства имен, который будет отображаться в дереве результатов. "

Вот небольшой пример преобразования, которое генерирует xsl:stylesheet, содержащее xsl:variable, построенное нужным образом:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xxx="my:dummyNS" exclude-result-prefixes="xxx"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:namespace-alias result-prefix="xsl" stylesheet-prefix="xxx"/>

 <xsl:template match="/*">
  <xxx:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xxx:variable name="{@name}">
    <xsl:value-of select="."/>
  </xxx:variable>
 </xxx:stylesheet>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему XML-документу:

<v name="myVarName">myValue</v>

желаемый результат получается:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="myVarName">myValue</xsl:variable>
</xsl:stylesheet>

Затем следующим шагом будет запуск в вашем "сценарии" этого динамически сгенерированного XSLT-преобразования.

person Dimitre Novatchev    schedule 11.12.2008
comment
Просто запуск вашего примера дает результат, отличный от вашего ответа. Что на самом деле получается: <xxx:stylesheet xmlns:xxx="http://www.w3.org/1999/XSL/Transform" version="1.0"><xxx:variable name="myVarName">myValue</xxx:variable></xxx:stylesheet> - person blast_hardcheese; 08.09.2016
comment
@blast_hardcheese, не гарантируется, что префикс пространства имен будет таким же, как тот, который указан в атрибуте result-prefix объявления xsl:namespace-alias - он используется только для указания пространства имен, в котором должны быть элементы literal-result вставить в вывод. Таким образом, какой префикс на самом деле использовать, зависит от XSLT-процессора. Saxon использует тот же префикс, что и указанный в атрибуте result-prefix. Однако другие процессоры XSLT могут свободно использовать все, что их разработчики сочтут целесообразным. - person Dimitre Novatchev; 08.09.2016
comment
@blast_hardcheese, вы, наверное, знаете, что если в двух файлах XML различаются только некоторые префиксы (а не URI пространства имен, к которым они привязаны), то эти два файла XML эквивалентны. - person Dimitre Novatchev; 09.09.2016