gpt4 book ai didi

xml - 有没有办法正确连接两个任意 XPath 表达式以产生新的有效 XPath 表达式?

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:55 26 4
gpt4 key购买 nike

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

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

例如,采用这个 XML:

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

XPath 表达式 /foo显然会返回根元素,而 /bar什么都不会返回。但是/bar应用于 /foo 的结果应该返回 <bar>元素。

现在最天真的实现是只使用字符串连接来构建 /foo/bar并对其进行评估以获得 <bar> .这适用于这种特定情况。

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

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

如果有问题:是否有任何种类的拼接可以在更多情况下起作用?

最佳答案

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

因此,任何求值为简单值(数字、字符串、 bool 值)的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

bool 运算符和not()函数:

not(expr1)

expr1 and expr2

expr1 or expr2

在 XPath 2.0 中:

操作符 except, intersect union

关于xml - 有没有办法正确连接两个任意 XPath 表达式以产生新的有效 XPath 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3253909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com