1

xml ドキュメントのサンプル:

  <xml>
    <list>
      <item refid="1" />
      <item refid="3" />
    </list>
    <catalogue>
      <model id="1"><details /></model>
      <model id="2"><details /></model>
      <model id="3"><details /></model>
    </catalogue>
  </xml>

//model[ @id = (//item/@refid) ] のようなクエリを実行して、「リスト」で参照されている id を持つすべての「モデル」を取得したいと思います

4

2 に答える 2

2

xpath 式は、必要なものを正確に返す必要があります。http://www.w3.org/TR/xpath/#booleansからの引用、第 5 段落:

比較対象の 1 つのオブジェクトがノード セットであり、もう 1 つのオブジェクトが文字列である場合、文字列値で比較を実行した結果がノード セット内に存在する場合にのみ、比較は真になります。ノードの他の文字列が true である

于 2010-06-20T13:46:21.797 に答える
2

//model[ @id = (//item/@refid) ] のようなクエリを実行して、「リスト」で参照されている id を持つすべての「モデル」を取得したいと思います

ここでの主な問題は、自信の欠如と、思いついた式を評価するために実際に XPath エンジンを実行していないことです。

提案した XPath 式を評価すると、次のようになります。

//model[ @id = (//item/@refid) ]

の子である要素の属性によって参照される属性を持つ (2 つの)model要素を正確に選択することがわかります。idrefiditemlist

@ Jörn-Horstmann は、彼の回答で、これらの結果が得られる理由をすでに説明しています。

一般に、//省略形の使用は避けてください。ドキュメント全体がスキャンされるため、非常に非効率的です。この場合、XPath 式を評価するために同等ですが、おそらくより高速に使用します。

/*/catalogue/model[@id = /*/list/item/@refid]
于 2010-06-20T14:56:47.930 に答える