我有这个XML文件,我想从中计算其中引用的用户数。但它们可以出现在多个类别中,我希望这些重复不被考虑在内 在下面的示例中,查询应该返回3而不是4.在XPath中是否有办法这样做?用户根本没有排序。
<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>
答案 0 :(得分:32)
纯XPath 1.0 - 单行:
使用强>:
count(/*/group/user[not(. = ../following-sibling::group/user)])
答案 1 :(得分:20)
使用函数名称空间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: Add namespace to root element
http://www.xqueryfunctions.com/xq/fn_distinct-values.html
http://msdn.microsoft.com/en-us/library/d6730bwt(VS.80).aspx
否则尝试Dimitre Novatchev的回答。
答案 2 :(得分:3)
我有更好的答案
count(//user[not(. = following::user/.)])
答案 3 :(得分:1)
不确定您是否可以在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.
答案 4 :(得分:0)
您需要使用两个这样的功能。
count(distinct-values(//list/group/user))
首先获取distinct
值,然后count
获取
答案 5 :(得分:0)
count(//user[not(./@name = preceding::user/@name)])
我认为最好的方法是尝试在纸上绘制xml数据,看看如何轻松解决它