我需要使用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由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
上使用。例如,它错误地从以下示例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>
有什么想法吗?
答案 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>