我正在尝试检测一个元素是否直接在其前面有评论。
我正在使用preceding-sibling::comment()[last()]
,但在下面的“B”元素的情况下这是不准确的:
<!-- Comment for A -->
<string name="A">A</string>
<string name="B">B</string>
这样做的正确方法是什么?
test="( preceding-sibling::* | preceding-sibling::comment() )[last()][self::comment()]"
这需要所有先前兄弟元素和注释的并集,获取它们中的最后一个,如果是注释则返回它们中的最后一个,并且测试返回true()
,因为返回的节点集是非空的。
请注意,如果我没有使用联合运算符,preceding-sibling::comment()[1]
则返回最接近的,因为应用于位置步骤的谓词是按邻近顺序排列的。您的使用[last()]
返回最远的评论,而不是最近的评论。在我上面的测试中,联合是文档顺序(因为它不是位置步骤,它是两个位置步骤的联合),而不是邻近顺序,所以我必须使用[last()]
and not [1]
。
我会用
preceding-sibling::node()[not(self::text()[not(normalize-space())])]
[1]
[self::comment()]
它找到第一个前面的兄弟节点,它不是纯空格文本节点,然后返回它,前提是它是一个注释。