2017-01-08 9 views
3

は、このXMLを考えると、それぞれの子ノードの親ノードの値を取得:のxpath:

<child id="1" name="alpha" >Some Text</child 
<child id="2" name="beta" > 
    <grandchild id="2.1"></grandchild> 
    <grandchild id="2.2"></grandchild> 
</child> 
<child id="3" name="gamma" mark="yes" > 
    <grandchild id="3.1" name="gamma-alpha"> </grandchild> 
    <grandchild id="3.2" name="gamma-beta" ></grandchild> 
</child> 

あり4つの孫ノードである、と私は両親のすべてを取得したい(することが起こるました私のサンプルデータ内の "子"ノード)のid値。私自身の微弱な試み:

//孫/親::子/ @ IDを

リターン:

text{"2"}, 
text{"3"} 

だけではなく、

text{"2"}, 
text{"2"}, 
text{"3"}, 
text{"3"} 

は、私が見てみたいものです。

答えて

4

あなたはそれぞれのgrandchild要素とアクセスparent::child/@idを反復するためにホスト言語を使用する必要がありますかは、XPath 2.0(https://www.w3.org/TR/xpath20/#id-for-expressions)に移動する必要があります以降とfor $gc in //grandchild return $gc/parent::child/@idを使用したりするXPath 3.0(https://www.w3.org/TR/xpath-30/#id-map-operator)以降と使用//grandchild!parent::child/@id。 XPathを使用すると、ノードを選択するパス内の任意のステップ/expが重複を排除するので、/を使用して1つの式を作成して、2つの要素の属性を4つ返すことはできません。

+0

答えは技術的には正しいものの、なぜ重複が現れないのか説明していません。 XPathは、必須ではなくノードセットで機能します。セットは、定義によって重複を含むことはできません。 – Lucero

+2

XPathがセットでのみ動作する場合、XPath 2.0または3.0の提案は機能しません。私は、ノードを選択するステップが重複を排除し、XPath 2.0と3.0のデータモデルと仕様の意味で正しいことを説明しました。 XPath 1.0がノードセットで動作することは間違いありません。 –

+0

はい、私はそれを指摘してくれてありがとう、XPath 1.0を意味すると書いたはずです。 – Lucero