2012-08-06 156 views
0

我有一個XML結構,它看起來像這樣 -XSL多個排序層次

<Root> 
    <name rank = "1">ABC 
    <name rank ="1">BCD</name> 
    </name> 
    <name rank ="0">XYZ 
    <name rank ="1">BCD</name> 
    <name rank ="3">YYZ</name> 
    <name rank ="0">FEG</name> 
    <name rank ="0">DEG</name>   
    </name> 
</Root> 

我想通過它的一個副本,保留層次來改造這個XML,它的順序 排序(1 )按職級(升序) (2)如果隊伍是相等的,排序它的名字(升序)

改造後,結構應該是這樣的。

<Root>  
     <name rank ="0">XYZ 
     <name rank ="0">DEG</name> 
     <name rank ="0">FEG</name> 
     <name rank ="1">BCD</name> 
     <name rank ="3">YYZ</name>   
     </name> 
     <name rank = "1">ABC 
     <name rank ="1">BCD</name> 
     </name> 
</Root> 

我有下面的XSL,它不保留層次結構或給我正確的排序。有人可以幫我嗎?這是我第一次與XSL合作,並希望得到正確方向的幫助或指引。

<xsl:template match="/*"> 

    <xsl:copy> 
    <xsl:for-each select="//name"> 
     <xsl:sort select="@rank" data-type="number" order="ascending"/> 
     <xsl:sort select="name" order="ascending" /> 
     <xsl:copy-of select="."/> 
    </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 
+1

提供的XML文檔中沒有「DEG」字符串。另外,' XYZ' - 這隻有三個孩子,但結果兒童的數量是四個。 ???請修改並更正。 – 2012-08-06 14:36:19

+0

對不起,修正了錯字。 – Vic11 2012-08-06 15:33:53

回答

0

這種轉變

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

<xsl:template match="/*"> 
    <Root> 
    <xsl:apply-templates select="name"> 
    <xsl:sort select="@rank" data-type="number"/> 
    <xsl:sort/> 
    </xsl:apply-templates> 
    </Root> 
</xsl:template> 

<xsl:template match="name"> 
    <name rank="{@rank}"> 
    <xsl:copy-of select="text()"/> 
    <xsl:apply-templates select="name"> 
    <xsl:sort select="@rank" data-type="number"/> 
    <xsl:sort/> 
    </xsl:apply-templates> 
    </name> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<Root> 
    <name rank = "1">ABC 
    <name rank ="1">BCD</name> 
    </name> 
    <name rank ="0">XYZ 
    <name rank ="1">BCD</name> 
    <name rank ="3">YYZ</name> 
    <name rank ="0">FEG</name> 
    <name rank ="0">DEG</name> 
    </name> 
</Root> 

產生想要的,正確的結果

<Root> 
    <name rank="0">XYZ 
     <name rank="0">DEG</name> 
     <name rank="0">FEG</name> 
     <name rank="1">BCD</name> 
     <name rank="3">YYZ</name></name> 
    <name rank="1">ABC 
     <name rank="1">BCD</name></name> 
</Root> 

說明

使用兩個xsl:sort指令。排序操作的優先級對應於相應的xsl:sort指令的文檔順序。

+0

- 太棒了!非常感謝你。我有一個後續問題。在我的情況下,元素始終不會是(可能是Root1,Root2等)是否可以按照原樣複製整個文檔,然後應用排序? – Vic11 2012-08-06 16:18:07

+0

不需要雙程。只需使用:'xsl:copy'而不是'Root' – 2012-08-06 16:19:17