在Xpath中不同?

我有这个XML文件,我想从中计算引用的用户数。 但他们可以出现在多个类别中,我希望这些副本不被考虑在内。
在下面的例子中,查询应该返回3而不是4.有没有在XPath的方式来这样做? 用户根本没有sorting。

<list> <group name='QA'> <user name='name1'>name1@email</user> <user name='name2'>name2@email</user> </group> <group name='DEV'> <user name='name3'>name3@email</user> <user name='name2'>name2@email</user> </group> </list> 

一个纯XPath 1.0 – 一行

用途

count(/*/group/user[not(. = ../following-sibling::group/user)])

使用你可以使用的函数命名空间http://www.w3.org/2005/xpath-functions

 distinct-values(//list/group/user) 

更新:

在你的xsl / xslt文件的顶部,你应该有一个样式表元素,将上面的url映射到前缀fn ,如下所示…

 <xsl:stylesheet version="1.0" xmlns:fn="http://www.w3.org/2005/xpath-functions" > 

那么你可以使用

 select="fn:distinct-values(//list/group/user)" 

这将假设你正在模板中做这个,而不是在一些xpathdocument对象中,在这种情况下你需要使用一个namespacemanager类。

链接…

XSLT:向根元素添加名称空间

http://www.xqueryfunctions.com/xq/fn_distinct-values.html

http://msdn.microsoft.com/en-us/library/d6730bwt(VS.80).aspx

否则,请尝试Dimitre Novatchev的答案。

我有一个更好的答案

 count(//user[not(. = following::user/.)]) 

不知道你是否可以在XPath中完成,但可以使用System.Linq轻松完成:

 string xml = "<list><group name='QA'><user name='name1'>name1@email</user><user name='name2'>name2@email</user></group><group name='DEV'><user name='name3'>name3@email</user><user name='name2'>name2@email</user></group></list>"; XElement xe = XElement.Parse(xml); int distinctCount = xe.Elements().Elements().Select(n => n.Value).Distinct().Count(); 

在这个例子中,distinctCount将等于3。

你将需要使用这样的两个function。

 count(distinct-values(//list/group/user)) 

首先得到distinct值,然后count它们