2015-09-05 86 views
1

我使用XSLT 2.0(Saxon PE 9.5)从输入创建多个XML文件,使用xsl:result-document。每个项目可以包含多个项目,并且在一个项目中有typeA和typeB。对于每个我想要生成的类型和XML。 实施例:
input.xml中
XSLT2从嵌套输入结构生成多个输出

<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> 

但不知道如何进一步分裂的类型。

回答

2

是不是只是:

<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> 
+0

谢谢各位高手!只是一个小问题:该位置是基于类型元素的位置。而不是生成out1_typeA,out2_typeB,out3_typeA如何根据项目进行定位,即:out1_typeA,out1_typeB,out2_typeA? – Bruckwald

+1

我已经编辑了答案来做到这一点。 –

+0

我知道你的时间不多,但你能否给你的答案添加解释?否则,如果你愿意,我可以自己编辑解释。 –