XSLT 或 XPATH:测试 <body>/<div>

XSLT or XPATH: Test for <body>/<div>

我想测试 html <body> 紧接着 <div> 的条件,因为它们之间没有任何内容。

这是一个无效的示例 <xsl:if test="//div[preceding::*[1][self::body]][1]">。其他路径语句错误地击中了文档的更深处 <divs>

我正在使用 XSLT 2.0 和 Xpath 2 或 3。

所以您想找到作为 body 的第一个子元素的任何 div 元素?

//div[parent::body][not(preceding-sibling::*)]

如果您要求 div 元素是 body 的第一个子 node(而不仅仅是第一个子 元素,所以在开头 <body><div> 之间没有文本节点或评论)那么你可以使用

//div[parent::body][not(preceding-sibling::node())]

一个改进是允许两个开始标签之间有空格,但不允许非空格文本节点:

//div[parent::body][not(preceding-sibling::*)]
                   [not(preceding-sibling::text()[normalize-space()])]

(如果您的样式表执行 <xsl:strip-space elements="*"/>,则没有必要这样做,因为那样会完全忽略纯空白文本节点)。

如果使用 body/node()[1][self::div],则检查 body 元素的第一个子节点是否为 div 元素。