使用XPath直接获取以前的XML注释

时间:2013-07-19 00:30:05

标签: xml xpath dom4j

我正在尝试检测元素是否在其前面有注释。

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

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

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

2 个答案:

答案 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()]

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