2012-03-12 41 views
1

我不是非常好,XSL,但我想整理以下XML:XML文件類型的特定節點使用XSLT

<Parent> 
     <node1/> 
     <class>b</class> 

     <class>c</class> 


     <node2/> 
     <class>a</class> 
</Parent> 

成以下,這樣只有類元素進行排序和其他元素不變:

<Parent> 
     <node1/> 
     <class>a</class> 
     <class>b</class> 
     <class>c</class> 
     <node2/>   
</Parent> 

我使用的是Java代碼中的以下XSL轉換我的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="class"> 
    <xsl:copy> 
    <xsl:apply-templates select="*" > 
    <xsl:sort order="ascending" select="class" /> 

    </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

這給了我:

<Parent> 
    <node1/> 
    <class/> 
    <class/> 
    <node2/> 
    <class/> 
</Parent> 
+0

在輸出XML你的樣品'了'是node1'和'node2'之間',雖然在最初的XML'a'在'node2'下。這是對的嗎? – 2012-03-12 18:44:08

+0

正確..我希望所有其他節點都在自己的位置,但將類節點放在一起。 – 2012-03-12 18:53:53

回答

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="class[1]"> 
    <xsl:for-each select="//class"> 
     <xsl:sort select="."/> 
     <xsl:copy-of select="."/> 
    </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="class"/> 

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

</xsl:stylesheet> 

輸出:

<Parent> 
    <node1 /> 
    <class>a</class> 
    <class>b</class> 
    <class>c</class> 
    <node2 /> 
</Parent> 
+0

非常感謝Kirill這個神奇的作品... – 2012-03-12 19:22:05

+0

@KaziIslam,不客氣。 – 2012-03-12 19:25:42