姬長信(Redy)

ruby-Nokogiri和concat()


如何在Nokogiri xpath表达式中使用concat()?我试过了:

xml.xpath("concat(/root/a/text(), /root/b/text())")

但这失败了:

ArgumentError: node_set must be a Nokogiri::XML::NodeSet

实际上,Nokogiri似乎只接受以“.”开头的xpath表达式.或“ /”,所以我尝试了以下方法:

xml.xpath(".concat(/root/a/text(), /root/b/text())")
xml.xpath("/concat(/root/a/text(), /root/b/text())")
xml.xpath("/concat('foo', 'bar')")

但是它们都因以下错误而失败:

Nokogiri::XML::XPath::SyntaxError: Invalid expression: /concat(‘foo’,
‘bar’)

我知道Nokogiri基于libxml2,因此它仅实现XPath 1.0.但是concat()是XPath 1.0的一部分.但是,XPath 2.0中的一个类似函数是string-join(),我给了它一个机会:

xml.xpath("string-join('foo', 'bar')")     

错误信息:

RuntimeError: xmlXPathCompOpEval: function string-join not found

看到,这是与concat()不同的错误消息.因此至少找到了函数concat().可能以某种方式起作用的另一个提示是…

xml.xpath("concat()")                                                           

…返回预期的错误消息:

Nokogiri::XML::XPath::SyntaxError: Invalid number of arguments:
concat()

有机会让concat()与参数一起工作吗?

附注:基本的xpath表达式,例如xml.xpath(“ / root / a / text()”)可以正常工作.