Использовать 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 не вариант.

10.12.2008 21:29:56
2 ОТВЕТА
РЕШЕНИЕ

То, что вы хотите, в настоящее время невозможно в чистом XSLT (1.0 или 2.0).

Если вы используете процессор Saxon 9.x XSLT , есть пара функций расширения, которые реализуют это: saxon: compile-stylesheet () и saxon: transform () .

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

1
11.12.2008 14:22:25

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

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

Как объяснено в спецификации XSLT 1.0 :

"

<! - Категория: элемент верхнего уровня ->
<XSL: пространства имен-псевдонимов
  префикс таблицы стилей = префикс | "#дефолт"
  префикс результата = префикс | "#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содержащий an 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-объявление = "да" отступ = "да" />

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

 <xsl: template match = "/ *">
  <xxx: версия таблицы стилей = "1.0"
  XMLNS: XSL = "http://www.w3.org/1999/XSL/Transform">

  <xxx: имя переменной = "{@ name}">
    <xsl: value-of select = "." />
  </ Ххх: переменная>
 </ Ххх: таблица стилей>
 </ XSL: шаблон>
</ XSL: таблицы стилей>

Когда это преобразование применяется к следующему документу 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: таблицы стилей>

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

14
11.12.2008 00:56:17
Просто запуск вашего примера приводит к другому результату вашего ответа. Что на самом деле выходит: <xxx:stylesheet xmlns:xxx="http://www.w3.org/1999/XSL/Transform" version="1.0"><xxx:variable name="myVarName">myValue</xxx:variable></xxx:stylesheet>
blast_hardcheese 8.09.2016 14:39:33
@blast_hardcheese, не гарантируется, что префикс пространства имен совпадает с префиксом, указанным в result-prefixатрибуте xsl:namespace-aliasобъявления - он используется только для указания пространства имен , в которое элементы литерального результата должны быть помещены в вывод. Таким образом, какой префикс на самом деле использовать, зависит от XSLT-процессора. Saxon использует тот же префикс, который указан в result-prefixатрибуте. Тем не менее, другие процессоры XSLT могут свободно использовать то, что их разработчики посчитали целесообразным.
Dimitre Novatchev 8.09.2016 16:00:25
@blast_hardcheese, вы, наверное, знаете, что если в двух файлах XML разные префиксы (а не URI пространства имен, к которым они привязаны) различны, то эти два файла XML эквивалентны.
Dimitre Novatchev 9.09.2016 04:24:00