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

Xml 如何使用XPath根据多个子元素选择不同的元素?,xml,xpath,Xml,Xpath,我需要使用XPath根据多个子元素选择不同的元素 我有这样一些XML: <Cars> <Car> <Make>SuperCar</Make> <Year>2009</Year> </Car> <Car> <Make>SuperCar</Make> <Year>2010</Year> </Car>

我需要使用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>
/*/Car[not(./Make/text()=following-sibling::Car/Make/text()
   and ./Model/text()=following-sibling::Car/Model/text())]
然而,我不太清楚如何调整它以正确使用多个字段

我考虑过这样的事情:

<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>
/*/Car[not(./Make/text()=following-sibling::Car/Make/text()
   and ./Model/text()=following-sibling::Car/Model/text())]
但这会检查
Make
是否在任何地方使用,以及
车型是否在任何地方使用,而不会确保它们必须在同一辆
汽车上使用。例如,它错误地从以下示例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>

超级跑车
2009
超级跑车
2010
了不起的汽车
2009

有什么想法吗?

使用XPath1.0似乎不可能做到这一点:


以下XPath查询根据品牌和年份返回不同的汽车(使用XML示例时):

检查前面的同级更为明显,因为它们已被“索引”。上面的查询提供以下输出:

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

超级跑车
2009
超级跑车
2010
了不起的汽车
2010

您可以使用
键()
函数来完成此操作。感谢您的尝试,但不幸的是,它无法工作。如果在开始处添加
{AwesomeCar,2009}
Car
,则查询将无效地排除
{AwesomeCar,2010}
。原因是,
前面的sibling
子句没有(我认为也不能)强制同时引用同一个sibling。这意味着XPath被解读为(任何同级具有Make)或(任何同级具有年份),而不是预期的(任何同级具有Make和年份)。这方面的一个例子是(单击Test查看输出)。