问候,
我正在寻找一种在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中执行此操作,还是仅使用单一文档?
提前致谢。
答案 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”。