【问题标题】:Is there a way to correctly concatenate two arbitrary XPath expressions to result in a new valid XPath expression?有没有办法正确连接两个任意 XPath 表达式以生成一个新的有效 XPath 表达式?
【发布时间】:2011-03-16 07:09:04
【问题描述】:

我正在寻找一种方法来连接两个任意的有效 XPath 表达式来构建一个新的 XPath 表达式。

实际上,我想将第二个 XPath 表达式应用于第一个 XPath 表达式的结果。

以这个 XML 为例:

<foo>
  <bar>
    <baz />
  </bar>
<foo>

XPath 表达式/foo 显然会返回根元素,而/bar 不会返回任何内容。但是/bar 应用于/foo 的结果应该返回&lt;bar&gt;元素。

现在最简单的实现是只使用字符串连接来构建/foo/bar 并评估它以获得&lt;bar&gt;。这适用于这种特定情况。

现在我的问题是:总是那么简单吗?是否有任何类型的 XPath 表达式不会产生有效的表达式或会导致意外结果?

如果不能以这种方式验证一些晦涩的 XPath 表达式,这不是什么大问题,但我希望常用的也能工作。

如果有问题:是否有任何类型的串联适用于更多情况?

【问题讨论】:

  • 好问题 (+1)。有关详细讨论和许多示例,请参阅我的答案。

标签: xml xpath


【解决方案1】:

在 XPath 1.0 中,/ 运算符要求其左侧的操作数是选择节点集的类型,其右侧的操作数是相对 XPath 表达式——也是类型选择一个节点集。

因此,任何计算结果为简单值(数字、字符串、布尔值)的expr1 都不能用于/ 的左侧。这对于/ 的右侧参数是完全正确的。

无效 XPath 1.0 表达式的

示例

string(/foo)/bar

count(//foo)/bar

(/foo/baz = 3)/bar

/foo/count(bar)

在 XPath 2.0 中仍然要求 expr1/expr2 expr1 必须评估为节点集。但是,expr2 可以是函数调用。因此以下是有效的并且具有有意义的结果:

/foo/bar/string-length(.)(:整数序列,是每个/foo/bar节点的字符串长度:)

/foo/bar/name(.) (: 字符串序列是每个/foo/bar 节点的名称:)

foo/bar/count(node())(:整数序列,是每个/foo/bar节点的子节点数:)

还可以使用其他连接器来组合两个表达式以生成第三个:

在 XPath 1.0 和 XPath 2.0 中:

联合运算符:

expr1 | expr2

比较运算符:

expr1 = expr2
expr1 >= expr2
expr1 < expr2
expr1 <= expr2
expr1 != expr2

布尔运算符和not()函数:

not(expr1)

expr1 and expr2

expr1 or expr2

在 XPath 2.0 中

运营商exceptintersectunion

【讨论】:

  • 很好的答案,谢谢!我只考虑选择节点集的表达式(因为这些对我来说最重要),所以我错过了一大块!
  • @Joachim-Sauer:很高兴我的回答很有用。考虑接受? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 2022-10-03
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多