代码之家  ›  专栏  ›  技术社区  ›  Joachim Sauer

有没有一种方法可以正确地连接两个任意的XPath表达式以生成一个新的有效的XPath表达式?

  •  3
  • Joachim Sauer  · 技术社区  · 14 年前

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

    例如,以以下XML为例:

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

    /foo 显然会返回根元素 /bar 什么也不回。但是 应用于 你应该把钱还给我 <bar>

    现在最简单的实现就是使用字符串连接来构建 /foo/bar 然后评估一下 <条形图>

    如果一些晦涩难懂的XPath表达式不能通过这种方式进行验证,这并不是什么大问题,但是我希望常见的XPath表达式能够正常工作。

    如果有问题:是否有任何类型的串联在更多的情况下工作?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Dimitre Novatchev    14 年前

    在XPath 1.0中 这个 /

    因此,任何 expr1 / . 这正是正确的右手边的论点 .

    示例

    string(/foo)/bar
    
    count(//foo)/bar
    
    (/foo/baz = 3)/bar
    
    /foo/count(bar)
    

    仍然需要 expr1/expr2 表达式1 expr2 可以是函数调用。因此,以下是有效的,并有意义的结果:

    /foo/bar/string-length(.) (:一个整数序列,是每个 /foo/bar 节点:)

    /foo/bar/name(.) (:字符串序列,是每个 /食物/酒吧

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

    可能会使用其他接头 要组合两个表达式以生成第三个表达式,请执行以下操作:

    在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
    

    在XPath2.0中

    操作员 except intersect union