XMLとXQuerieを使用しています。私は通常、親ノードに関連するXPath式を使用して、その子ノードを取得します。しかし、子ノードがある場合に反対の意味を実行する方法、その親ノードを取得する方法がわかりません。
<node id="50>
<childnode1 childid="51" />
<childnode2 childid="52" />
</node>
ノードがある場合<childnode1 childid="51" />
、親を取得するにはどうすればよいですか:<node id="50>
短い答え:
..
これにより、現在の(コンテキスト)ノードの親が選択されます。
より長くより一般的な回答:
//node()[childnode1/@childid="51"]
これにより、childnode1
という名前の子要素があり、属性childid
があり、値が「51」であるドキュメント内のノードが選択されます。
//
の省略形を含む式は、非常に非効率的である可能性があるため、避けるようにしてください。 '//'は、XMLドキュメントの構造が事前にわからない場合にのみ使用してください。
ベストアンサー:
ExpressionSelectingTheChildNode/..
次のように、..
を使用して親を取得します。
../childnode1
したがって、次のようなXMLドキュメントがある場合:
<a id="1">
<b id="2">
<c id="3">
<d id="4"/>
</c>
<c id="5"/>
<c id="6">
<d id="7"/>
</c>
</b>
</a>
次にXQuery
//../d[@id = "4"]
3
のc
を持つid
ノードを返します。
親ノード(..)を取得するより複雑な例を次に示します。
Q)ある国で最も人気のある言語が別の国で最も人気のない言語であり、両方の国が複数の言語をリストしているすべての状況を見つけます。 https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/countries.xml
A)
for $b in doc("countries.xml")/countries/country/language
for $c in doc("countries.xml")/countries/country/language
where $b/../@name != $c/../@name
and data($b) = data($c)
and count($b/../language) > 1
and count($c/../language) > 1
and $b/@percentage = max($b/../language/@percentage)
and $c/@percentage = min($c/../language/@percentage)
return
<LangPair language="{data($b)}">
<MostPopular>{data($b/../@name)}</MostPopular>
<LeastPopular>{data($c/../@name)}</LeastPopular>
</LangPair>
または、fn:root()
Xquery関数を使用することもできます。