XPath替换FOR语句

时间:2014-04-15 09:15:28

标签: xml xpath

我有这个XPath(感谢Ian Roberts在SO Xpath2.0 selecting first and last occurance of string with iteration中的回答):

Events/Properties[
  count(
    for $me in (Property[@Descriptor="200"]) return
      (preceding-sibling::Properties[1][Property[@Descriptor="200"] = $me],
       following-sibling::Properties[1][Property[@Descriptor="200"] = $me])
  ) != 2
]

XPath很棒,但我使用的工具不接受for声明。

如何重写此XPath以避免此问题[没有for语句]?

1 个答案:

答案 0 :(得分:1)

假设你的输入是有序的(这是重要的位!),你可以通过发出这些XPath 1.0表达式来实现:

小组中的第一个:

//Properties[
  Property/@Descriptor = 200
  and not(
    Property = preceding-sibling::*/Property[@Descriptor = 200]
  )
]

最后一组:

//Properties[
  Property/@Descriptor = 200
  and not(
    Property = following-sibling::*/Property[@Descriptor = 200]
  )
]

您可以从那里开始单独选择Property[@Descriptor = 100]Property[@Descriptor = 200]


您可以将两个表达式合并为一个:

//Properties[
  Property/@Descriptor = 200 and ( 
    not(
      Property = preceding-sibling::*/Property[@Descriptor = 200]
    ) or not(
      Property = following-sibling::*/Property[@Descriptor = 200]
    ) 
  )
]

您将获得<Properties>对的列表(各自组中的第一个和最后一个),但长度为一个元素的组除外。这意味着不能保证您不会返回偶数个节点。