2016-02-23 111 views
-1

我需要從多個節點中的兩個中提取文本。具有以下XML:XPath從多個節點中的兩個節點中提取文本

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

我想提取firstsecond節點只是文本有結果12。我怎樣才能做到這一點?

查詢concat(/nodes/first/text(), /nodes/second/text())適用於我,但我正在尋找更通用的東西,並且沒有/nodes部分的重複。

+0

爲什麼這個問題是downvoted?請提供一個理由,我可以解決它。 –

回答

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文庫(其中,根是一個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')]) 
+0

有沒有辦法避免使用XPath 2.0進行後期處理? –

+0

@MichalKordas你是什麼意思的「後處理」?如果你的意思只是使用xpath 2,那麼在我的文章結尾處的表達式就會根據你的要求選擇一個值'12'。無需執行任何額外工作 - xpath引擎完成所有工作。只有xpath 1有這個限制。不幸的是,xpath 2工具是非常罕見的。 – Matthew

+0

是的,我的意思是隻使用XPath,沒有其他工具。順便說一下,我的節點可以在任何地方,他們沒有排序,所以我不能使用'position()' –