2011-03-17 52 views
1

任何人都可以請建議如何使用XSLT按屬性名稱排序XML?使用XSLT按屬性名稱排序XML

例如:我的XML是如下

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <!-- test 1 --> 
    <test g="r"> 
     <a g="c" d="e">one</a> 
     <!-- a k z d b --> 
     <a k="z" d="b">two</a> 
     <a s="h" d="5">three</a> 
     <!-- a a b d 4 --> 
     <a a="b" d="4">four</a> 
     <a b="q" d="3">five</a> 
     <a s="a" d="8">3three</a> 
     <a x="i" d="2">six</a> 
     <!-- six 2 a f h i 2 --> 
     <a f="h" i="2">six</a> 
     <a l="t" d="1">seven</a> 
    </test> 
    <!-- test 2 --> 
    <test t="b"> 
     <!-- six 2 a z i d 2 --> 
     <a z="i" d="2">six</a> 
     <a r="z" d="b">two</a> 
     <a a="c" d="e">one</a> 
     <a u="h" d="5">three</a> 
     <!-- four --> 
     <a c="b" d="4">four</a> 
     <a h="q" d="3">five</a> 
     <a p="t" d="1">seven</a> 
    </test> 
</root> 

預期的輸出應該是:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <!-- test 1 --> 
    <test g="r"> 
     <!-- a a b d 4 --> 
     <a a="b" d="4">four</a> 
     <a b="q" d="3">five</a> 
     <a g="c" d="e">one</a> 
     <!-- six 2 a f h i 2 --> 
     <a f="h" i="2">six</a>  
     <!-- a k z d b --> 
     <a k="z" d="b">two</a> 
     <a l="t" d="1">seven</a> 
     <a s="a" d="8">3three</a> 
     <a s="h" d="5">three</a> 
     <a x="i" d="2">six</a> 
    </test> 
    <!-- test 2 --> 
    <test t="b"> 
     <a a="c" d="e">one</a> 
     <!-- four --> 
     <a c="b" d="4">four</a> 
     <a h="q" d="3">five</a> 
     <a p="t" d="1">seven</a> 
     <a r="z" d="b">two</a> 
     <a u="h" d="5">three</a> 
     <!-- six 2 a z i d 2 --> 
     <a z="i" d="2">six</a> 
    </test> 
</root> 
+0

我可以給你一個答案,但它可能不足以滿足你的任務...你想對未命名爲'd'的第一個(字母順序)屬性進行排序嗎? – 2011-03-19 02:24:57

回答

0

我自己找到了解決方案..下面是用於按屬性名稱排序的代碼行。

<xsl:sort select="local-name(@*)"/> 

夥計們,感謝您的所有努力。

+0

請注意,這是錯誤的,因爲[博士給出的理由Michael Kay](http://stackoverflow.com/questions/5338628/sort-xml-by-attribute-names-using-xslt/5338948#5338948)。因爲隱式轉換,這將等於'local-name(@ * [1])'。 – 2011-03-20 22:21:47

+0

@Alejandro:local-name(@*)local-name(@*[1])都代表該節點的第一個屬性。這是看什麼。在邁克爾解決方案的情況下,他說:「你無法預測@ * [1]會選擇哪個屬性......」但是當我使用local-name(@*)local-name(@*[1])時,它總是選擇節點的第一個屬性進行排序。所以我提到它是可能的。 2011-03-21 09:12:44

+0

在這種情況下,它將僅基於第一個屬性進行排序。這應該擴展爲通過傳遞屬性

local-name(@*[position()])
的位置,然後它將基於所有可用屬性進行排序。如果我說錯了什麼,請糾正我。感謝@Alejandro發佈和更新我。 2011-03-21 09:13:22

0
<xsl:template match="test"> 
    <xsl:apply-templates> 
     <xsl:sort select="@d"/> 
    </xsl:apply-templates> 
    </xsl:template> 

將讓你的屬性d排序test下的元素。

您可以通過添加另一個xsl:sort來執行多個排序級別。

更多關於這裏的分選:http://www.w3.org/TR/xslt#sorting

+0

哦,我沒有看到您的預期輸出。所以你想按屬性名稱排序。我不確定這是可能的,讓我們看看... – Ptival 2011-03-17 12:12:59

+0

對不起ptival ..我期望在一個通用的XSLT排序格式的答案..如果可以,請張貼relavent通用XSLT。 – 2011-03-17 12:14:28

+0

那麼,您如何期望XSLT能夠弄清楚它應該對哪些屬性進行排序呢? – Ptival 2011-03-17 12:19:55

2

我懷疑你可能會想它來排序的第一個屬性的名稱。這是無法完成的,因爲屬性順序在XML中沒有意義,並且您無法預測@ * [1]將選擇哪個屬性。

0

已經在這裏找到答案後1429991

的(奇怪的是,代碼示例中的問題作品的機構)。