相对路径中的Xpath count()

时间:2014-11-16 12:27:07

标签: xml xpath

我正在使用http://www.freeformatter.com/xpath-tester.html测试一些xpath表达式( xpath 1.0

我有这个xml代码

<urls>
    <url uri="http://example.com/pingtest.html">
        <elements>
            <element title="header" xpath="My header"></element>
        </elements>
    </url>
    <url uri="http://example.com/othertest.html">
        <elements>
            <element title="header3" xpath="Third header"/>
            <element title="header2" xpath="Second header"/>
        </elements>
    </url>
</urls>

通常当我使用// element / @ title查询xpath时,我实际上得到了

  

属性=&#39;标题=&#34;头&#34;&#39;属性=&#39;标题=&#34; header3&#34;&#39;   属性=&#39;标题=&#34; HEADER2&#34;&#39;

我正在寻找的是通过网址获取元素数量的方法。它可能是这样的。当我查询:

//urls/url/elements/count(element)

我应该得到(编辑:正如@Ian Roberts所说,这个查询在xpath 2.0中有效):

  

双=&#39; 1.0&#39;双=&#39; 2.0&#39;

有没有办法在单个xpath表达式中执行此操作?

一些失败的例子

这将返回所有元素3的计数(不是我正在寻找的)

count(//urls/url/elements/element)

这将返回所有元素列表2的计数(不是我正在寻找的)

count(//urls/url/elements)

我需要这个,因为我需要知道xml对每个url有多少个元素,所以我之后可以使用这个数量

2 个答案:

答案 0 :(得分:2)

您可以在任何XPath 2.0或更高版本或XQuery 1.0或更高版本的实现中使用//urls/url/elements/count(element)来获取带有计数的整数值序列。如果您只有XPath 1.0,那么您需要先用您的主机语言选择//urls/url,然后您可以为每个返回的项目选择count(elements/element)

答案 1 :(得分:1)

我相信你所寻找的东西是无法做到的......

//element/@title在XML中搜索包含带title属性的元素的路径;然后返回这些属性的数组及其值。

//urls/url返回包含元素url的元素url的路径的xml元素数组。 count(/elements/element)然后对上述每条路径中element元素下elements个元素的数量执行计数功能。

尝试将这些放入单个xpath会给我们//urls/url/count(/elements/element)。 这里的问题是xpath用于两个目的:

  • 匹配我们感兴趣的元素的路径
  • 对该路径中的项目执行聚合功能。

然而,xpath只能用于一个函数或另一个函数(例如,取决于它是从match还是select语句调用。

因此(根据@ MartinHonnen的回答),您需要先进行匹配,然后通过执行select的结果进行迭代。