Выбор встроенного выходного документа с использованием результирующего документа в XSLT 2.0 - PullRequest
3 голосов
/ 11 марта 2009

Привет,

Я ищу метод, позволяющий выполнить выборочный вывод документа в XSLT. Мне известен метод, при котором каждый создает узел xsl:result-document, чтобы одно преобразование применялось к нескольким документам. Обычно этот метод использует несколько проходов, таких как:

<xsl:template match="/">
    <xsl:apply-templates select="*"/>
    <xsl:result-document href="test.xml">
        <xsl:apply-templates select="*"/>
    </xsl:result-document>
</xsl:template>

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

<xsl:variable name="treeBase">
    <Base/>
</xsl:variable>

<xsl:template match="/">
    <xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="these_elements">
    <xsl:param name="temp" select="$treeBase"/>


</xsl:template>

<xsl:template match="not_these_elements">
    <xsl:param name="temp" select="$treeBase"/>

    <xsl:apply-templates select="@*|node()">
       <xsl:with-param name="temp">
           <Base>
              <xsl:copy-of select="$temp/Base/*"/>
              <Item>
                  <xsl:value-of select="ThisItem"/>
              </Item>
           </Base>
        </xsl:with-param>
</xsl:template>

Зачем вам это нужно? В моем XSLT я строю временное дерево с помощью рекурсивных вызовов параметров. Я хочу вывести временное дерево, поскольку оно создается в отдельный документ, но все еще использую временное дерево, созданное для управления потоком. При использовании текущего метода мне пришлось бы дважды пройти сложное преобразование.

Есть ли способ сделать это в XSLT или это однопроходный, только для одного документа?

Заранее спасибо.

1 Ответ

1 голос
/ 12 марта 2009

Вот рабочий пример, как это сделать :

Это преобразование :

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <!--                                               -->    
    <xsl:template match="/*">
      <xsl:variable name="vTop" select="."/>
  <!--                                               -->    
        <xsl:for-each-group select="num" group-by="xs:integer(.) mod 2">
          <xsl:result-document href="file:///C:/Temp/file{position()}.xml">
            <xsl:element name="{name($vTop)}">
              <xsl:copy-of select="current-group()"/>
            </xsl:element>
          </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>010</num>
</nums>

создает два требуемых файла : file1.xml и file2.xml , которые содержат соответственно элементы «num» с нечетными и четными значения.

Обратите внимание , что нет «multiplr проходов» и код является «встроенным», как требуется.

...