我正在开发一个接受用户定义的XPath表达式的应用程序,并将它们用作运行时操作的一部分。
但是,我希望能够通过编程方式操作表达式来推断一些额外的数据,我很想知道这种方法是否有任何失败的情况。
给定任何返回节点集的用户定义的XPath表达式,将其包装在XPath count()
函数中以确定集合中的节点数是安全的:
count(user_defined_expression)
同样,将数组索引附加到表达式以提取集合中的一个节点是否安全:
user_defined_expression[1]
答案 0 :(得分:3)
XPath表达式(在XPath 1.0中)可以产生节点集或字符串或数字或布尔值,而count(表达式)只对产生节点集的任何表达式有意义。
至于添加位置谓词,我想您可能希望在表达式周围使用括号,即将/root/foo/bar
更改为(/root/foo/bar)[1]
,因为您选择了第一个bar
元素由/root/foo/bar
选择的节点集,如果没有它们,您将获得/root/foo/bar[1]
,这将选择bar
元素的任何foo
子元素的第一个root
子元素
答案 1 :(得分:2)
您是否正在检查此类用户定义的表达式是否始终评估为节点集?
如果是,首先是Expr就可以了。数据类型对fn:count
第二个是非常棘手的,例如,在很多情况下谓词会超重轴。 Check this answer进行简单分析。很难说,用户的真正含义。
答案 2 :(得分:1)
更强大的方法是将XPath表达式转换为XQueryX,XQueryX是抽象语法树的XML表示形式;然后,您可以对此XML表示执行XQuery或XSLT转换,然后转换回修改后的XPath(或XQuery)进行评估。
然而,这仍然只会给你表达式的句法结构;如果你想要语义信息,比如结果的推断静态类型,你可能不得不在暴露这些信息的XPath进程中戳。