2013-03-29 112 views
2

我試圖在導入和導出下循環子元素。創建父元素字段並將名稱爲字段的所有元素置於其中,僅在導入下,不包括結構下的元素字段,在所有元素結構上創建元素結構,最後一項工作是使用值重命名所有元素屬性名稱。我只知道先複製他們所有的人,不能去下一步創建正確的模板。添加父元素並重命名子元素

輸入:

<?xml version='1.0'?> 
<jco name="TEST" timestamp="1275691115508" version="1.0"> 
<import> 
    <field name="RESERVED_IN">12345</field> 
    <structure name="GM_HEADER"> 
       <field name="PSTNG_DATE">2004-07-02</field> 
     <field name="DOC_DATE">2004-04-02</field> 
    </structure> 
    <structure name="TESTRUN"> 
     <field name="TESTRUN"></field> 
    </structure> 
</import> 
<export> 
    <field name="RESERVED_OUT"></field> 
    <structure name="GM_HEADER_RET"> 
     <field name="MAT_DOC"></field> 
     <field name="DOC_YEAR">0000</field> 
    </structure> 
</export> 
</jco> 

所需的輸出:

<?xml version="1.0" ?> 
<jco version="1.0" name="TEST"> 
    <import> 
     <fields> 
      <RESERVED_IN>12345</RESERVED_IN> 
     </fields> 
     <structures> 
      <GM_HEADER> 
       <PSTNG_DATE>2004-07-02</PSTNG_DATE> 
       <DOC_DATE>2004-04-02</DOC_DATE> 
      </GM_HEADER> 
      <TESTRUN> 
       <TESTRUN></TESTRUN> 
      </TESTRUN> 
     </structures> 
    </import> 
    <export> 
     <fields> 
      <RESERVED_OUT></RESERVED_OUT> 
     </fields> 
     <structures> 
      <GM_HEADER_RET> 
       <MAT_DOC></MAT_DOC> 
       <DOC_YEAR>0000</DOC_YEAR> 
      </GM_HEADER_RET> 
     </structures> 
    </export> 
</jco> 

下面是我的XSLT,但似乎搞砸了。

<xsl:template match="node()|@*"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()|@*" /> 
      </xsl:copy> 
     </xsl:template> 

     <xsl:template match="import"> 
      <fields> 
       <xsl:for-each select="/field"> 
        <xsl:call-template name="field" /> 
       </xsl:for-each> 
      </fields> 
      <structures> 
       <xsl:for-each select="/structure"> 
        <xsl:element name="{@name}"> 
         <xsl:value-of select="." /> 
        </xsl:element> 
        <xsl:call-template name="field" /> 
       </xsl:for-each> 
      </structures> 
     </xsl:template> 

     <xsl:template name="field"> 
      <xsl:for-each select="/field"> 
        <xsl:element name="{@name}"> 
         <xsl:value-of select="." /> 
        </xsl:element> 
       </xsl:for-each> 
     </xsl:template> 

回答

2

使用模板和apply-templates,不for-each,和它的作品了,而優雅:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs"> 

<xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* , node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="import | export"> 
    <xsl:copy> 
    <fields> 
     <xsl:apply-templates select="field"/> 
    </fields> 
    <structures> 
     <xsl:apply-templates select="structure"/> 
    </structures> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="field | structure"> 
    <xsl:element name="{@name}"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

謝謝馬丁,這是非常有用的,我真的投了你的答案,但我必須小於聲望15。 –