Использовать XSL для генерации динамического XSL, который выполняется в том же сценарии? - PullRequest
5 голосов
/ 11 декабря 2008

Я хочу динамически создавать переменные с динамическими именами для последующего использования в моем преобразовании, но для этого мне нужно динамически сгенерировать 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 невозможно.

Ответы [ 2 ]

14 голосов
/ 11 декабря 2008

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

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

Как объяснено XSLT 1.0 Spec .:

"

<!-- 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-преобразования .

1 голос
/ 11 декабря 2008

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

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

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

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