我需要从许多节点中的两个节点中提取文本。拥有以下XML:
<nodes>
<first>1</first>
<second>2</second>
<third>3</third>
</nodes>
我想从first
和second
节点中仅提取文本以获得结果12
。我怎么能这样做?
查询concat(/nodes/first/text(), /nodes/second/text())
对我有用,但我正在寻找更通用的内容而不会重复/nodes
部分。
答案 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()<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')])