2016-05-18 11 views
0

は、このXMLを考えると整合させるためのツリー全体を取得することはできません。XPathは子供

<Orders> 
    <Order> 
     <Item name="xyz"/> 
    </Order> 
    <Order> 
     <Item name="123"/> 
    </Order> 
</Orders> 

なぜ/受注/発注[項目[名@ = '123']]リターン:

<Order> 
    <Item name="123" /> 
</Order> 

しかし、/受注[受注[項目[名@ = '123']]]戻り値:この2番目のシナリオで

<Orders> 
    <Order> 
     <Item name="xyz" /> 
    </Order> 
    <Order> 
     <Item name="123" /> 
    </Order> 
</Orders> 

名のマッチングは無視されます。

何のXPath私は戻って取得する必要があります:

<Orders> 
    <Order> 
     <Item name="123" /> 
    </Order> 
</Orders> 
+0

Jim Garrisonは、子ノードの表示を制限したい場合、既にそれについて素敵な説明をしてくれました。[この質問](http://stackoverflow.com/questions/7115917/xpath-select-node-but) -not-specific-child-elements) – t0mppa

答えて

0

短い答えは掲載XML与えられた、ある、あなたは、XPathを使用してその出力を得ることができません。

XPathは、XMLの一部(特にXPath 1.0)を検索するためのものです。 opening-tag、content、および対応するclosing-tagは、1つの要素ノードとみなされます。だから、返すと期待している<Order>子要素を1つしか持たないそのような<Orders>要素は、元のXMLの一部ではないため、XPathを使って返すことはできません。

XPathは、XSLTとXPointerの両方で使用されるように設計されたXMLドキュメントの一部を扱うための言語です。 [参考:XPath 1.0 Spec]

2

あなたの表現

/Orders[Order[Item[@name='123']]] 

が言うので、2番目の例では、それが何を返す理由は次のとおりです。

  1. が含まれていOrdersノード
  2. を探しますOrder nmde
  3. Thaそれはすなわち全体Ordersノード、返されるものであるので、tは、ItemノードそのItemノードが値を持つ属性nameあなたはOrdersノードに焦点を当て123

お知らせがあり

  • が含まれています。

    ソースドキュメントには何もありませんので、の変換が発生するよう求めています。私のXPathはやや錆びていますが、私はXPath自体がこれを行うことができるとは考えていません。 XSLTを使用してXMLを必要なものに変換する必要があるでしょう。