3

初歩的な質問はこちら:

次の XML の抜粋があるとします。

<root>
  <element>
    <child1>a</child1><child2>b</child2><child3>c</child3>
  </element>
</root>

child3コンテキストにいるときは、ノードpreceding-sibling::*を取得するために使用できchild2ます。わかった。

次の XML の抜粋:

<root>
  <element child1="a" child2="b" child3="c">
  </element>
</root>

私がコンテキストにいるとき、属性ノードchild3を取得するための軸が XPath 1.0 にないのは正しいですか? child2利用できないようなものが必要だと思いpreceding-sibling-attribute::ます。

副次的な質問として、これは XPath 2 で可能ですか?

4

1 に答える 1

4

ある属性から別の属性に移動する単一の軸がないことは事実ですが、もちろん、軸をチェーンすることでそこに到達できます。

XPathが使用するデータモデルでは、属性は親要素の「子」とは見なされないため、兄弟とは見なされません。それが機能しない理由の1つpreceding-sibling::です。また、属性が「子」ではないという点でchild1、などの属性名が誤解を招く可能性があることも意味します。child2

他の理由preceding-sibling::が機能しないのは、特定の要素の属性の順序が未定義(実装に依存)であるためです。属性は、特定のシリアル化(ファイルなど)で特定の順序でリストする必要がありますが、そのファイルを解析して、属性を別の順序で再度出力することができ、XML情報モデルポイントからは同じドキュメントと見なされます。ビューの。したがって、XMLには「previous」または「preceding」属性などはありません。

child2属性のコンテキストから属性の値を取得するにはchild3、必要な属性をどのように知っているかに応じて、これらのいずれかを使用できます...

../@child2

child2「親要素の名前付き属性」

../@*[name() != name(current())]

「親要素の他の属性(これではない)」

あなたも試すことができます

../@*[2]

ただし、属性の順序が定義されていないため、結果は一般に予測できません。

例のように、属性名にインデックスコンポーネント(1、2、3)が含まれている場合は、の番号をname(current())より小さな番号に置き換えることができます。

あなたの副次的な質問に答えるために、それはあなたの要件がどのように定義されているかに依存します。要件が「前の属性を選択する」である場合、いいえ、その概念はXPath2でも定義されていません。

于 2012-11-30T15:57:55.270 に答える