web-dev-qa-db-ja.com

XQueryを使用して親ノードを取得する方法は?

XMLとXQuerieを使用しています。私は通常、親ノードに関連するXPath式を使用して、その子ノードを取得します。しかし、子ノードがある場合に反対の意味を実行する方法、その親ノードを取得する方法がわかりません。

<node id="50>
  <childnode1 childid="51" />
  <childnode2 childid="52" />
</node>

ノードがある場合<childnode1 childid="51" />、親を取得するにはどうすればよいですか:<node id="50>

25
sony

短い答え

..

これにより、現在の(コンテキスト)ノードの親が選択されます。

より長くより一般的な回答

//node()[childnode1/@childid="51"]

これにより、childnode1という名前の子要素があり、属性childidがあり、値が「51」であるドキュメント内のノードが選択されます。

//の省略形を含む式は、非常に非効率的である可能性があるため、避けるようにしてください。 '//'は、XMLドキュメントの構造が事前にわからない場合にのみ使用してください。

ベストアンサー

ExpressionSelectingTheChildNode/..
22

次のように、..を使用して親を取得します。

../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"]

3cを持つidノードを返します。

5
Nathan Hughes

親ノード(..)を取得するより複雑な例を次に示します。

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>
2
Xavier John

または、fn:root()Xquery関数を使用することもできます。

0
bosari