我正在尝试打印多个元素的名称,但我只能说服 XPath 输出一个。
鉴于此 XML:
<xml>
<foob>931</foob>
<arba>478</arba>
<zfoo>892</zfoo>
</xml>
我尝试这个并得到foob
:
name(//*[contains(name(), "foo")])
我尝试此操作并收到有关无效表达式的错误:
//*[contains(name(), "foo")]/name()
虽然这工作正常:
//*[contains(name(), "foo")]/text()
我在命令行上尝试了 xmllint
和 xpath
(来自 Perl 的 XML-XPath 模块),得到了相同的结果。
我怎样才能同时返回foob
和zfoo
?
最佳答案
使用 XPath 1.0,您的第一个 XPath,
name(//*[contains(name(), "foo")])
结果只是“foob”
,因为XPath 1.0仅将所选节点集的第一个成员传递给name()
。要获取 "foob"
和 "zfoo"
列表,您必须使用托管 XPath 调用的语言(XSLT、Python、Java)迭代选定的节点集等
使用 XPath 2.0,您的第二个 XPath,
//*[contains(name(), "foo")]/name()
仅通过 XPath 直接获取 "foob"
和 "zfoo"
列表就可以很好地工作。
关于xml - 打印多个匹配的元素名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44595035/