如何使用XPath根据多个子元素选择不同的元素?

时间:2012-11-26 05:39:27

标签: xml xpath

我需要使用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)来仅选择不同的元素,其中distinct由MakeYear定义。

在上面的示例中,这将意味着返回除最后一个之外的所有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上使用。例如,它错误地从以下示例XML中排除了第一个Car

<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>

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

使用XPath1.0似乎是不可能的:

How to select distinct values from XML document using XPATH?

答案 1 :(得分:0)

以下XPath查询根据Make和Year(使用您的XML示例)返回不同的汽车:

/*/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>