1

我正在尝试检测一个元素是否直接在其前面有评论。

我正在使用preceding-sibling::comment()[last()],但在下面的“B”元素的情况下这是不准确的:

<!-- Comment for A -->
<string name="A">A</string>
<string name="B">B</string>

这样做的正确方法是什么?

4

2 回答 2

2

test="( preceding-sibling::* | preceding-sibling::comment() )[last()][self::comment()]"

这需要所有先前兄弟元素和注释的并集,获取它们中的最后一个,如果是注释则返回它们中的最后一个,并且测试返回true(),因为返回的节点集是非空的。

请注意,如果我没有使用联合运算符,preceding-sibling::comment()[1]则返回最接近的,因为应用于位置步骤的谓词是按邻近顺序排列的。您的使用[last()]返回最远的评论,而不是最近的评论。在我上面的测试中,联合是文档顺序(因为它不是位置步骤,它是两个位置步骤的联合),而不是邻近顺序,所以我必须使用[last()]and not [1]

于 2013-07-19T00:59:37.247 回答
0

我会用

preceding-sibling::node()[not(self::text()[not(normalize-space())])]
                         [1]
                         [self::comment()]

它找到第一个前面的兄弟节点,它不是纯空格文本节点,然后返回它,前提是它是一个注释。

于 2013-07-19T08:36:45.327 回答