使用XSLT 2.0中的结果文档选择内联输出文档

时间:2009-03-11 18:03:12

标签: xslt xslt-2.0

问候,

我正在寻找一种在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 个答案:

答案 0 :(得分:1)

以下是如何执行此操作的工作示例

此转化

<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 pass”且代码为“inline”。