【问题标题】:Using XPath count() with contains()将 XPath count() 与 contains() 一起使用
【发布时间】:2011-12-15 14:49:02
【问题描述】:

我正在使用以下(次优)XML:

<a>
  <b>
    <c>X:1 Y:0</c>
    <c>X:1 Y:0</c>
    <c>X:2 Y:0</c>
  </b>
  <b>
    <c>X:1 Y:0</c>
    <c>X:2 Y:0</c>
  </b>
</a>

我正在尝试使用 XPath 来计算内容包含 X:1&lt;c&gt; 节点的数量:

count(contains(/a/b/c, 'X:1'))

但是,这会返回错误而不是返回 3 的预期计数。

我做错了什么?

【问题讨论】:

  • 这是我倾向于建议使用将这些元素扩展为&lt;c&gt;&lt;X&gt;1&lt;/X&gt;&lt;Y&gt;0&lt;/Y&gt;&lt;/c&gt; 等的样式表对您的XML 进行预处理的情况之一,然后处理这样的数据就变得微不足道了。如果这只是一次性任务,那么这可能不值得,但如果这是您必须做很多事情的事情,那么首先考虑将数据转换为更可用的形式绝对值得。

标签: xml xpath


【解决方案1】:

这不是您使用contains() 的方式。试试

count(/a/b/c[contains(., 'X:1')])

【讨论】:

  • @gjb, @Phil 更像:“这不是你使用 count() 的方式”,因为问题是 count() 将节点集作为参数,但 contains() 返回一个布尔值价值。
  • @jasso contains() 期望参数一是字符串,而不是节点集,所以确实存在两个问题
  • @Phil 实际上,在您的示例中,contains() 的第一个参数也是一个节点集。这里的重点是 XPath 规范明确指出参数被转换为函数所需的类型,如果参数不能转换为所需的类型,则这是一个错误。 contains() 成功,但 count() 失败,因为非节点集类型的参数无法转换为节点集。
  • 有趣...当我对来自 OP 的样本数据运行 count(...) 命令时,我得到 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
【解决方案2】:

可能效率更高一点(如果提供的 XML 文档中显示的属性不是偶然的):

count(/a/b/c[starts-with(., 'X:1')])

【讨论】:

  • +1 表示您的建议,但恐怕顺序有时可能会有所不同。
  • @gjb:如果是这样,最好提供一个更好的 XML 示例,事实上显示了这一点。
猜你喜欢
  • 1970-01-01
  • 2014-07-18
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多