2017-03-03 5 views
1

次のXMLドキュメント考えてみましょう:私は次の出力を取得しようとするのXPath:選択ルート、フィルタの子要素

<inst> 
    <ins> 
    <id>id_01</id> 
    <pos>1</pos> 
    </ins> 
    <ins> 
    <id>id_02</id> 
    <pos>1</pos> 
    </ins> 
</inst> 

を:

<inst> 
    <ins> 
    <id>id_01</id> 
    <pos>1</pos> 
    </ins> 
</inst> 

を私は次のXQuery/XPath式を書きました:

doc('database/data.xml')/inst[ins/id='id_01']

これは、希望の結果が、誰を与えるものではありませんleドキュメントであり、フィルタリング条件が存在しない場合と同じです。しかし、XML文書に存在しないidを入れた場合、結果は空です。

私はちょうどこのステートメントが間違っているか分からない。

答えて

1

あなたが書いたのXPath、

/inst[ins/id='id_01'] 

は、文字列値"id_01"をある子要素を持つins子要素が含まれているinstルート要素を選択するように言います。あなたのXMLのルートが実際にこの基準を満たしていないので、それが選択されている:

<inst> 
    <ins> 
    <id>id_01</id> 
    <pos>1</pos> 
    </ins> 
    <ins> 
    <id>id_02</id> 
    <pos>1</pos> 
    </ins> 
</inst> 

をあなただけではなく、このXMLを選択するために、

/inst/ins[id='id_01'] 

をこのXPathを使用することができ、

<ins> 
    <id>id_01</id> 
    <pos>1</pos> 
</ins> 

ただし、ルート要素を選択するXPathはありません。第2のins要素は、実行しようとしているようです。その理由は、XPathはの選択であり、XMLの変換ではないからです。あなたのXMLには要素がなく、2番目の要素(id_02ins要素がない要素は選択できません。 XMLを変換する場合は、代わりにXSLTを使用します。

-1

あなたは

<inst>{doc('database/data.xml')/inst/ins[id eq "id_01"]}</inst>
"値比較" 演算子(EQ、LT、など)が 'EQ' を使用するように、単一の値を比較するので、より良い設計されていますlike-何か

を書くことができます