2013-01-09 43 views
0

我使用以下格式的XML文件。XML變換遞歸和屬性作爲節點名稱

<Main> 
    <root> 
     <group firstname="daniel" secondname="creig"> 
      <a firstname="tin" secondname="tao"/> 
       <b firstname="bella" secondname="james"> 
        <c firstname="khadhar" secondname="abdul"> 
         <d firstname="xiang" secondname="tin"/> 
        </c> 
       </b> 
     </group> 
    </root> 
</Main> 

我試圖得到如下的輸出。

<members> 
    <member><id>group</id><firstname>daniel</firstname><secondname>creig</secondname></member> 
    <member><id>a</id><firstname>tin</firstname><secondname>tao</secondname></member> 
    <member><id>b</id><firstname>bella</firstname><secondname>james</secondname></member> 
    <member><id>c</id><firstname>khadhar</firstname><secondname>abdul</secondname></member> 
    <member><id>d</id><firstname>xiang</firstname><secondname>tin</secondname></member> 
</members> 

到目前爲止我的XSL將看起來像這樣。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- Elements Section --> 
<xsl:template match="/*/root/*"> 
<member> 
    <id> 
     <xsl:value-of select="local-name()" /> 
    </id> 
    <attr> 
     <xsl:apply-templates select="@*" /> 
    </attr> 
</member> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:value-of select="(.)" /> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

我需要的是將任意深度的XML樹中的節點轉換爲數組。提前致謝。

+1

什麼都不會使用該模板工作,因爲它是不合法的XML更不用說XSLT。 「節點」的開放在哪裏!什麼是'id'?它們都不會出現在您的示例輸出中。哪裏需要遞歸? – EJP

+0

我已更正我的帖子。如果xml節點包含子節點,則需要遞歸。 – user1961077

+0

請提供您想要的*完整*輸出。當前提供的所需輸出僅包含層次結構前兩個級別的結果。爲了更好地理解問題,我們需要知道需要完整的輸出。 –

回答

1

這個怎麼樣:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="root//*"> 
    <member> 
     <id><xsl:value-of select="local-name(.)" /></id> 
     <xsl:apply-templates select="@*" /> 
    </member> 
    <xsl:apply-templates select="*" /> 
</xsl:template> 

<xsl:template match="root//@*"> 
    <xsl:element name="{local-name(.)}"> 
     <xsl:value-of select="." /> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

JLRishe的答案是正確的,沒有多少修改。謝謝大家。 – user1961077

相關問題