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)来仅选择不同的元素,其中 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。例如,它错误地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

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

如何使用 XPATH 从 XML 文档中选择不同的值?

于 2012-11-26T05:48:27.110 回答
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>
于 2012-11-27T08:34:45.020 回答