2015-09-05 52 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

我知道你的時間不多,但你能否給你的答案添加解釋?否則,如果你願意,我可以自己編輯解釋。 –