我试图打印多个元素的名称,但我只能说服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
返回?
答案 0 :(得分:2)
使用 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"
的列表。