2012-06-25 90 views
2

我無法獲得following-sibling軸工作。XPath的:所有的兄弟姐妹的名字節點

我有一個XML文檔如下。我嘗試了類似name(/T/p/q/following-sibling::*[1]。我知道name將導致只有第一個集合的,但是,這表達不返回任何東西。我正在Ubuntu上嘗試使用xmlstarlet命令的XPath。

<T> 
<p><q> 
<a1>A</a1> 
<a2>A</a2> 
<a3>A</a3> 
<a4>A</a4> 
<a5><b1>A</b1></a5> 
</q></p> 
</T> 

給定的輸入爲/T/p/q,我想它的所有子元素節點的名稱,但最多也只有這一水平。也就是說,輸出應該是

a1 
a2 
a3 
a4 
a5 

回答

1

實際上,它比你想象的要簡單得多。

/T/p/q/* 

返回節點集a1, a2, a3, a4, a5

它選擇的q所有的孩子這是p孩子這是T孩子這是context node的孩子。

而且說的「孩子」,我的意思是「直接子」。不是「後代」。因此,它只會選擇a1-a5級別的節點。

正如你所說的,name()函數只返回節點集中第一個節點的名稱。我猜你必須遍歷節點集來獲取所有名稱作爲單個字符串。


使用xmlstarlet,你可以這樣做:

xml sel -t -m "/T/p/q/*" -v "name(.)" -n input.xml 

它的節點集相匹配,在它的每一個節點上調用name(.),之後打印一個換行符。

  • -m匹配XPath表達式
  • -v打印由XPath表達式
  • -n返回的值用於一個換行
  • more here

要使用following-sibling軸,你必須在同一個水平上,因爲立場選擇所有以下兄弟姐妹a2,你會使用/T/p/q/a2/following-sibling::*。這將返回a3, a4, a5

+0

謝謝,Slanec。我如何使用'/ T/p/q/*'來僅返回節點名稱? 'name'函數只會返回第一個?至於你的「跟隨兄弟姐妹」的例子,問題是,我不會提前知道「q」的第一個(或任何)孩子的名字。對不起,我之前沒有澄清過。 – cogitoergosum

+0

@cogitoergosum我更新了一個完整的'xmlstarlet'查詢獲得所有名稱的答案。 –

+0

謝謝Slanec!它有幫助。 @Dimitre Novatchev,我會用你的解決方案。但是,我的要求是在Derby數據庫的SQL中繞過XPath(我剛剛做了)。不管怎麼說,還是要謝謝你 ! – cogitoergosum

2

在XPath 1.0,不可能通過評估單個 XPath表達式來獲得孩子的元素/T/p/q/*的希望所有名字。

因此,所有的元件需要在第一步驟中被選擇:

/T/p/q/* 

然後,對於包含在所得的XmlNodeList,一個新的XPath表達式的每個元素,評估關閉該元件,產生其名字。

該算法的不同實現是可能的,使用不同的託管語言的XPath 1.0中。

下面是一個例子,其中對於XPath 1.0中的主導語言是XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:variable name="vWanted" select="/T/p/q/*"/> 

    <xsl:for-each select="$vWanted"> 
    <xsl:value-of select="name()"/> <xsl:text> </xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<T> 
    <p><q> 
    <a1>A</a1> 
    <a2>A</a2> 
    <a3>A</a3> 
    <a4>A</a4> 
    <a5><b1>A</b1></a5> 
    </q></p> 
</T> 

算法的兩個步驟被執行並且產生想要的結果:

a1 a2 a3 a4 a5 

II。一個XPath 2.0表達 - 溶液:

/T/p/q/*/name() 

以上的XPath 2.0表達式的計算產生的五個項目,其中的每一個是一個不同/T/p/q/*元素的名稱的序列。