XPath从多个节点中的两个节点中提取文本

时间:2016-02-23 07:16:34

标签: xml xpath

我需要从许多节点中的两个节点中提取文本。拥有以下XML:

<nodes>
    <first>1</first>
    <second>2</second>
    <third>3</third>
</nodes>

我想从firstsecond节点中仅提取文本以获得结果12。我怎么能这样做?

查询concat(/nodes/first/text(), /nodes/second/text())对我有用,但我正在寻找更通用的内容而不会重复/nodes部分。

1 个答案:

答案 0 :(得分:1)

这在很大程度上取决于您的实施。使用xpath 1,您选择的方式将是唯一可行的方法(除了使用可以编写扩展函数的实现)。 XPath 1无法自行处理。

但是,我们可以使用

选择所有相关节点
/nodes/*[local-name()='first' or local-name()='second']

/nodes/*[self::first or self::second]

或者如果您想要一系列头寸,我们可以将其简化为

/nodes/*[position()<3]

然后使用我们的实现来进行连接。

例如,使用XSLT,我可能会

<xsl:for-each select="/nodes/*[position()&lt;3]">
    <xsl:value-of select="."/>
</xsl:for-each>

或者在编程语言中使用xpath函数,我们可以迭代结果并将其连接起来。例如,使用python和lxml库(其中root是保存文档的lxml.etree对象),我们可以(使用基于位置的选择器)

"".join(root.xpath("/nodes/*[position()<3]/text()"))

使用xpath 2,可以直接使用

string-join(/nodes/*[position()<3],'')

实际上,如果我们需要按名称选择,xpath 2允许我们简化列出的第一个xpath表达式,并且

string-join(/nodes/*[local-name()=('first','second')])