在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/*
元素的名稱的序列。
謝謝,Slanec。我如何使用'/ T/p/q/*'來僅返回節點名稱? 'name'函數只會返回第一個?至於你的「跟隨兄弟姐妹」的例子,問題是,我不會提前知道「q」的第一個(或任何)孩子的名字。對不起,我之前沒有澄清過。 – cogitoergosum
@cogitoergosum我更新了一個完整的'xmlstarlet'查詢獲得所有名稱的答案。 –
謝謝Slanec!它有幫助。 @Dimitre Novatchev,我會用你的解決方案。但是,我的要求是在Derby數據庫的SQL中繞過XPath(我剛剛做了)。不管怎麼說,還是要謝謝你 ! – cogitoergosum