我学习XPath的次数越多,我就越需要回复参考
例如,当我在某些中间步骤中发现某些信息时,我有时需要稍后使用该信息。这个问题实际上有一个解决方法,在谓词表达能力的帮助下也包含XPathes。工作解决方案看起来像这样
/foo/item[@attrtocheck = ../../otheritem[@anotherattr]]
但是这种方法的问题在于我只是根据某些标准评估谓词,并且基于此不能有多个后续结果。即使有许多相同的@anotherattr的其他项目,我也无法收集它们。所以更好的解决方案是
/foo/item[@attrtocheck]/../../otheritem[@anotherattr=BACKREFERENCING_ATTRTOCHECK_VALUE]
但只要我知道这是不可能的。
如果标准中没有解决方案,也许某些工具/图书馆有扩展名?实际上我实现了自己的引擎,如果已经存在非标准语法,我会采用它。
更新:在Michael Kay评论之后,更多关于我错过这个功能的原因
实际上我正在尝试使用XPath搜索AST(抽象语法树)。我不是第一个尝试这样做的人(网络搜索[Xpath AST])。这种搜索揭示了树的不同部分之间非常强的关系。例如,当我在某些上下文中找到一些调用时(例如在其他方法中),我想知道这个符号是作为虚函数引入的,然后将它输出到结果中。在这种情况下,我的第一个搜索产生一些以前未知的符号(函数名称),我想在以下子广告中使用它(搜索类声明及其关键字)。因此,反向引用将非常有用。
我认为如果它适用于AST那么就有可能在其他结构化数据中建立这样的关系。
答案 0 :(得分:2)
在XQuery中,您可以使用let .. return
来声明临时变量。像这样:
/foo/item[@attrtocheck]/(let $backreference := @attrtocheck return ../../otheritem[@anotherattr=$backreference])
在XPath 2中,您可以使用for循环模拟let表达式:
/foo/item[@attrtocheck]/(for $backreference in @attrtocheck return ../../otheritem[@anotherattr=$backreference])
或者您可以按预期使用for循环,并且不使用“反向引用”:
for $value in /foo/item[@attrtocheck]/@attrtocheck return otheritem[@anotherattr=$value]
在这种情况下,由于比较是存在的,你可以使用:
otheritem[@anotherattr = /foo/item/@attrtocheck]
(顺便说一句,我也编写了自己的XPath实现,我有变量的语法((values:= / xx / a / @ id)[0],/ xx / b [@id = $ values])声明,使用:=定义变量,以及()[0]防止$值出现在返回的序列中。)
答案 1 :(得分:0)
我接受了BeniBela解决方案(Dimitre Novatchev也提到过),虽然我发现这个功能在某种程度上缺乏XPath 1.0缩写语法的简洁性和表现力。
我还考虑实现我自己的函数,该函数返回引用先前找到的值。它会接受负偏移来绝对地引用先前的步骤(从表达式的开始)。所以这将以类似
的方式结束 /foo/item[@attrtocheck]/../../otheritem[@anotherattr=backref(-2)]
我认为在XPath中没有这样的函数,我不会丢失一般语法,并且在路径中多次引用前面的步骤看起来比多个语句更具表现力