我必須從一個XML文檔中選擇唯一記錄,在<xsl:for-each>
循環的上下文中。我被Visual Studio限制爲使用XSL 1.0。在XSLT/XPath中選擇唯一記錄
<availList>
<item>
<schDate>2010-06-24</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>13:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-24</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>13:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-25</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>12:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-26</schDate>
<schFrmTime>13:00:00</schFrmTime>
<schToTime>14:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-26</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>12:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
</availList>
的獨特性必須建立在三個子元素的值:schDate
,schFrmTime
和schToTime
。如果兩個item
元素對於所有三個子元素具有相同的值,則它們是重複的。在上面的XML中,項目1和2是重複的。其餘都是獨一無二的。如上所示,每個項目都包含我們不希望在比較中包含的其他元素。 「唯一性」應該是這三個要素的一個因素,而且僅限於這三個因素。
我試圖通過以下來實現:
availList/item[not(schDate = preceding:: schDate and schFrmTime = preceding:: schFrmTime and schToTime = preceding:: schToTime)]
這背後的想法是選擇記錄,其中有與同schDate
,schFrmTime
和schToTime
沒有前面的元素。但是,它的輸出是錯過了最後一項。這是因爲我的XPath實際上排除了所有子元素值在整個前面的文檔內匹配的項目。沒有一個item
匹配所有最後一個項目的子元素 - 但由於每個元素的值分別出現在另一個項目中,最後一個項目被排除。
我能得到通過爲每個先前的項目比較所有子值作爲一個連接字符串到相同連接值正確的結果。有人知道我能做到這一點嗎?
好問題(+1)。查看我對XPath和XSLT解決方案的回答。 – 2010-06-10 19:46:38
使用key()的方法通常被稱爲Muenchian方法:http://www.jenitennison.com/xslt/grouping/muenchian.html – 2010-06-11 00:59:17