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