0

複数の子要素に基づいて個別の要素を選択するには、XPath を使用する必要があります。

次のような XML があります。

<Cars>
  <Car>
    <Make>SuperCar</Make>
    <Year>2009</Year>
  </Car>
  <Car>
    <Make>SuperCar</Make>
    <Year>2010</Year>
  </Car>
  <Car>
    <Make>AwesomeCar</Make>
    <Year>2010</Year>
  </Car>
  <Car>
    <Make>SuperCar</Make>
    <Year>2009</Year>
  </Car>
</Cars>

そして、XPath (私は XPath 1.0 に制限されています) を使用して、異なる要素のみを選択する必要がありMakeますYear

Car上記の例では、これは最後のオブジェクトを除くすべてのオブジェクトを返すことを意味します (これは最初の の複製であるためCar)。

典型的な状況 (つまり、オブジェクトが単一のキー フィールドによって識別される場合) では、次のような XPath を使用します。

/*/Car[not(./Id/text()=following-sibling::Car/Id/text())]

ただし、これを複数のフィールドを正しく使用するように適応させる方法がわかりません。

私は次のようなことを考えました:

/*/Car[not(./Make/text()=following-sibling::Car/Make/text()
   and ./Model/text()=following-sibling::Car/Model/text())]

Makeただし、 がどこでも使用されているかどうか、および がどこで使用されているかをチェックしますModelが、必ずしも同じ で使用されているかどうかは保証されませんCar。たとえばCar、次のサンプル XMLの最初の部分が誤って除外されています。

<Cars>
  <Car>
    <Make>SuperCar</Make>
    <Year>2009</Year>
  </Car>
  <Car>
    <Make>SuperCar</Make>
    <Year>2010</Year>
  </Car>
  <Car>
    <Make>AwesomeCar</Make>
    <Year>2009</Year>
  </Car>
</Cars>

何か案は?

4

2 に答える 2

0

次のXPathクエリは、(XMLの例を使用している間)MakeとYearに基づいて個別の車を返します。

/*/Car[not(./Make/text()=preceding-sibling::Car/Make/text() and ./Year/text()=preceding-sibling::Car/Year/text())]

先行する兄弟をチェックすることはより明白です、なぜならそれらはすでに「索引付けされている」からです。上記のクエリは、次の出力を提供します。

<Car>
    <Make>SuperCar</Make>
    <Year>2009</Year>
</Car>
<Car>
    <Make>SuperCar</Make>
    <Year>2010</Year>
</Car>
<Car>
    <Make>AwesomeCar</Make>
    <Year>2010</Year>
</Car>
于 2012-11-27T08:34:45.020 に答える
0

XPath1.0 を使用すると、これは不可能に思えます。

XPATHを使用してXMLドキュメントから個別の値を選択するには?

于 2012-11-26T05:48:27.110 に答える