2013-08-26 42 views
1

我在獲取也具有特定屬性的元素(基於名稱)的唯一列表時遇到了一些問題。我可以得到其中任何一個的列表,但綜合列表是什麼讓我絆倒。我的XML看起來是這樣的:XPath用於選擇具有Xpath 2.0特定屬性的元素的唯一列表

<global> 
    <discipline name="tracks"> 
     <group name="Normal"/> 
     <group name="Gloss" PackGroup="Diffuse"/> 
     <group name="Mask"/> 
     <group name="Diffuse"/> 
     <group name="Tint" PackGroup="Gloss"/> 
    </discipline> 
    <discipline name="trains"> 
     <group name="Mask"/> 
     <group name="Diffuse" PackGroup="Mask"/> 
    </discipline> 
</global> 

我可以很輕鬆地使用此XPath查詢得到族元素的獨特列表:

/configuration/global/discipline/group[not(@name = following::group/@name)] 

並獲得定義有PackGroup屬性組元素的列表是微不足道以及:

/configuration/global/discipline/group[@PackGroup] 

但是,我似乎無法得到PackGroup屬性定義的元素的唯一列表。我已經試過這樣:

/configuration/global/discipline/group[not(@name = following::group/@name) and @PackGroup] 
/configuration/global/discipline/group[not(@name = following::group/@name) and contains(@PackGroup, '*')] 

它不返回元素和

/configuration/global/discipline/group[not(@name = following::group/@name) and contains(@PackGroup, '')] 

返回剛纔的唯一列表。有誰知道什麼是正確的XPath查詢是爲了得到我在找什麼?

謝謝(我在C#和的情況下,XPath 2.0中的事項工作)!

回答

1

我想你要找的是什麼

/configuration/global/discipline/group 
    [not(@name = following::group[@Packgroup]/@name) and @PackGroup] 

你要確保兩個你過濾(在表達式中第一個group)本集團與下面的一組,你檢查for(第二個group)具有@Packgroup屬性。

還有一種方法可以使用distinct-values()函數來做到這一點,但我還沒有想過在這一點上。

+1

完美,感謝LarsH! – user1200340

3

一個更有效的解決方案(爲O(n log n)的,而不是O(N * N))將

for $n in distinct-values(//group[@Packgroup]/@name) 
return (//group[@Packgroup][@name=$n])[1]