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
元素。
我想测试 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
元素。