我有这个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
语句]?
答案 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>
对的列表(各自组中的第一个和最后一个),但长度为一个元素的组除外。这意味着不能保证您不会返回偶数个节点。