2016-11-12 1 views
1

私はこのXMLを与えられ、式が返されますどのように多くの要素を示すように頼まれた:データベースXPathクエリ

<a> 
    <a> 
    <a>1</a> 
    <a>2</a> 
    </a> 
    <a> 
    <a>3</a> 
    <a>4</a> 
    </a> 
</a> 

XPathクエリは、次のとおりです。

i) //a[a/text()=3]/a 

ii) //a[a/a/text()=3]/a/a 

iii) //a[a/text()=2][a/text()=3] 

そして、与えられた答えは私です)2、 ii)4、iii)0

しかし、私はそれを理解しようとすると何か問題がありました。私にとっては、

私は最初に述語をチェックします。 // aは子孫またはselfを意味するので、// a/a/3をチェックしています。私はパスに記載されているので、

<a> 
    <a> 
    <a>3</a> 
    <a>4</a> 
    </a> 
</a> 

だから述語は真です。次に、私はこのブロックとしてme 2を返すXPathクエリを実行します。

<a> 
    <a>3</a> 
    <a>4</a> 
</a> 

には2つの内部が含まれています。次にii)については、まず述語// a/a/a/3をチェックします。これは上記と同じです。述語はtrueを返すので、// a/a/aのようなXPathクエリを実行します。私はこれを探していますので、しかし、それは1として返すべきではない:

<a> 
    <a> 
    <a>1</a> 
    </a> 
</a> 

私はそれをトレースする方法については本当に混乱していますと、私は答えが間違っていると私の考え方が間違っているかなり確信しています。簡単なやり方はありますか、それとももっと良い例がありますか?

ありがとうございます!

答えて

2

最初のXPathを例として説明します。この答えを読んだ後で、あなたが理解したことをXPathの残り​​の部分に適用することによって、理解をテストしてください。

  • //a:ドキュメントの任意の場所で、すべてaの要素を見つけます。これまでに7つの要素が返されました。
  • [a/text()=3]:子テキストノードのいずれかが3に等しい子要素aを有するものに以前のXPathによって見出さa要素をフィルタリングします。これまでは、1つの要素だけが返されました。 親の<a>3</a>である。
  • /a:戻る子要素a<a>3</a>要素が前のXPathで見つかりました。これは、の子が<a>3</a>の子である2つのa要素があるため、XPath全体が2つの要素を返すことを意味します。

Demo 1

出力:

<a>3</a> 
<a>4</a> 

UPDATE:

ちょうどあなたが1番目ではなく2番目のXPathと混同されていることに気付きました。しかし、最初のことについてのあなたの理解もちょっと分かりませんので、最初の答えはまだ役に立つと思います。ここでは第二のXPathについての簡単な説明は次のとおりです。

  • //a:ドキュメントの任意の場所で、すべてaの要素を見つけます。これまでに7つの要素が返されました。
  • [a/a/text()=3]:述語の式は、<a>3</a>の親と一致します。したがって、この時点までのXPath全体は1つの要素にしか一致しません。 ルート要素
  • /a/a:前のXPathで見つかったルート要素から、すべてのgrand-child a要素を返します。だから、全体のXPathは、説明のための4つの要素

Demo 2

+0

感謝を返します!しかし、最後の質問については素早くチェックするので、// aは7個の要素を返します。次に、最初の述語は基本的にテキストノードが2に等しいものを見つけます。この場合は、の親が残っています。その後、私は3を見つける別の述語を実行しますが、私は親2だけ残っているので、3は別の親にあるので、私は何も見つけられず、したがって0を返しますか?私は正しい方向にいるのだろうか? –

+0

@Whoamそこに行くよ!それが最後のXPathの仕組みです。おめでとう! – har07