打印多个匹配的元素名称

时间:2017-06-16 17:36:01

标签: xml xpath

我试图打印多个元素的名称,但我只能说服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()

我在命令行上,并尝试了xmllintxpath(来自Perl的XML-XPath模块),结果相同。

我怎样才能 foobzfoo返回?

1 个答案:

答案 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"的列表。