Xml 如何使用XPath根据多个子元素选择不同的元素?
我需要使用XPath根据多个子元素选择不同的元素 我有这样一些XML: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>
<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查看输出)。