在Xpath中有所区别?

时间:2010-05-11 15:45:59

标签: xml xpath distinct

我有这个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>

6 个答案:

答案 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数据,看看如何轻松解决它