1

我正在开发一个应用程序,它接受用户定义的 XPath 表达式并将它们用作其运行时操作的一部分。

但是,我希望能够通过以编程方式操作表达式来推断一些额外的数据,并且我很想知道是否存在这种方法可能会失败的任何情况。

给定任何返回节点集的用户定义 XPath 表达式,将其包装在 XPathcount()函数中以确定集合中的节点数是否安全:

count(user_defined_expression)

同样,将数组索引附加到表达式以提取集合中的一个节点是否安全:

user_defined_expression[1]
4

3 回答 3

3

好吧,一个 XPath 表达式(在 XPath 1.0 中)可以产生一个节点集或一个字符串或一个数字或一个布尔值,并且 count(expression) 只对产生节点集的任何表达式有意义。

至于添加位置谓词,我认为您可能希望在表达式周围使用括号,即更改/root/foo/bar(/root/foo/bar)[1]这样您选择bar节点集中的第一个元素,/root/foo/bar而如果没有它们,您将得到/root/foo/bar[1]哪个将选择第一bar个子元素foo元素的任何子root元素。

于 2011-02-15T12:06:54.043 回答
2

您是否正在检查此类用户定义的表达式是否始终评估为节点集?

如果是,则第一个 Expr 是可以的。数据类型将是正确的fn:count

第二个比较棘手,例如,在很多情况下谓词会超重轴。检查此答案以进行简单分析。很难说用户真正的意思。

于 2011-02-15T11:59:52.280 回答
1

更健壮的方法是将 XPath 表达式转换为 XQueryX,它是抽象语法树的 XML 表示;然后,您可以对此 XML 表示进行 XQuery 或 XSLT 转换,然后转换回修改后的 XPath(或 XQuery)以进行评估。

但是,这仍然只会为您提供表达式的句法结构;如果您需要语义信息,例如推断的结果的静态类型,您可能必须在公开此信息的 XPath 进程中进行操作。

于 2011-02-15T15:37:18.377 回答