XSLT2 从嵌套输入结构生成多个输出
XSLT2 Generate multiple outputs from a nested input structure
我正在使用 XSLT 2.0 (Saxon PE 9.5) 从输入创建多个 XML 文件,使用 xsl:result-document
。每个item可以包含多个item,一个item内有typeA和typeB。对于我想生成的每种此类类型,XML。
示例:
input.xml:
<task>
<items>
<item>
<typeA>
<id>A1</id>
...
</typeA>
<typeB>
<id>B</id>
...
</typeB>
</item>
<item>
<typeA>
<id>A2</id>
...
</typeA>
</item>
</items>
</task>
期望的输出:
out1_typea.xml:
<task>
<items>
<item>
<typeA>
<id>A</id>
...
</typeA>
</item>
</items>
</task>
out1_typeb.xml:
<task>
<items>
<item>
<typeB>
<id>B</id>
...
</typeB>
</item>
</items>
</task>
out2_typea.xml:
<task>
<items>
<item>
<typeA>
<id>A2</id>
...
</typeA>
</item>
</items>
</task>
我开始使用以下基于项目拆分的转换:
<xsl:template match="/task">
<xsl:for-each select="items/item">
<xsl:result-document href="out{position()}.xml">
<task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<items>
<item>
<xsl:copy-of select="*" />
</item>
</items>
<xsl:copy-of select="../../(* except items)" />
</task>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
但不知道如何进一步拆分类型。
不就是:
<xsl:template match="/task">
<xsl:for-each select="items/item">
<xsl:variable name="pos" select="position()"/>
<xsl:for-each select="*">
<xsl:result-document href="out{$pos}_{name()}.xml">
<task>
<items>
<item>
<xsl:copy-of select="." />
</item>
</items>
<xsl:copy-of select="../../../(* except items)" />
</task>
</xsl:result-document>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
我正在使用 XSLT 2.0 (Saxon PE 9.5) 从输入创建多个 XML 文件,使用 xsl:result-document
。每个item可以包含多个item,一个item内有typeA和typeB。对于我想生成的每种此类类型,XML。
示例:
input.xml:
<task>
<items>
<item>
<typeA>
<id>A1</id>
...
</typeA>
<typeB>
<id>B</id>
...
</typeB>
</item>
<item>
<typeA>
<id>A2</id>
...
</typeA>
</item>
</items>
</task>
期望的输出:
out1_typea.xml:
<task>
<items>
<item>
<typeA>
<id>A</id>
...
</typeA>
</item>
</items>
</task>
out1_typeb.xml:
<task>
<items>
<item>
<typeB>
<id>B</id>
...
</typeB>
</item>
</items>
</task>
out2_typea.xml:
<task>
<items>
<item>
<typeA>
<id>A2</id>
...
</typeA>
</item>
</items>
</task>
我开始使用以下基于项目拆分的转换:
<xsl:template match="/task">
<xsl:for-each select="items/item">
<xsl:result-document href="out{position()}.xml">
<task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<items>
<item>
<xsl:copy-of select="*" />
</item>
</items>
<xsl:copy-of select="../../(* except items)" />
</task>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
但不知道如何进一步拆分类型。
不就是:
<xsl:template match="/task">
<xsl:for-each select="items/item">
<xsl:variable name="pos" select="position()"/>
<xsl:for-each select="*">
<xsl:result-document href="out{$pos}_{name()}.xml">
<task>
<items>
<item>
<xsl:copy-of select="." />
</item>
</items>
<xsl:copy-of select="../../../(* except items)" />
</task>
</xsl:result-document>
</xsl:for-each>
</xsl:for-each>
</xsl:template>