Делаете двойной проход в XSL? - PullRequest
3 голосов
/ 21 ноября 2011

Можно ли сохранить выходные данные XSL-преобразования в некоторой переменной, а затем выполнить дополнительное преобразование содержимого переменной? (Все в одном файле XSL)

(предпочтительно XSLT-2.0)

Ответы [ 2 ]

8 голосов
/ 21 ноября 2011

XSLT 2.0 Решение:

<xsl:variable name="firstPassResult">
  <xsl:apply-templates select="/" mode="firstPass"/>
</xsl:variable>

<xsl:template match="/">
  <xsl:apply-templates select="$firstPassResult" mode="secondPass"/>
</xsl:template>

Хитрость здесь в том, чтобы использовать mode = "firstPassResult" для первого прохода, в то время как все шаблоны для прохода sedond должны иметь mode = "secondPass".

Edit:

Пример:

<root>
  <a>Init</a>
</root>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:variable name="firstPassResult">
    <xsl:apply-templates select="/" mode="firstPass"/>
  </xsl:variable>

  <xsl:template match="/" mode="firstPass">
      <test>
        <firstPass>
          <xsl:value-of select="root/a"/>
        </firstPass>
      </test>
  </xsl:template>

  <xsl:template match="/">
    <xsl:apply-templates select="$firstPassResult" mode="secondPass"/>
  </xsl:template>

  <xsl:template match="/" mode="secondPass">
    <xsl:message terminate="no">
      <xsl:copy-of select="."/>
    </xsl:message>
  </xsl:template>

</xsl:stylesheet>

Выход:

[xslt] <test><firstPass>Init</firstPass></test>

Таким образом, первый проход создает некоторые элементы с содержимым root / a, а второй выводит созданные элементы в стандартный вывод. Надеюсь, этого достаточно, чтобы вы пошли.

1 голос
/ 21 ноября 2011

Да, с XSLT 2.0 это легко.С XSLT 1.0 вы, конечно, также можете использовать режимы и сохранять временный результат в переменной так же, как в XSLT 2.0, но тогда эта переменная является фрагментом дерева результатов, чтобы иметь возможность обрабатывать его дальше с помощью шаблонов применения, которые вам необходимо использовать.функция расширения, такая как exsl: node-set для переменной.

...