在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
它们