我必须从一个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