xpath查找节点是否存在

Edd*_*dyR 197 xslt xpath expression

使用xpath查询如何查找是否存在节点(标记)?

例如,如果我需要确保网站页面具有正确的基本结构,如/ html/body和/ html/head/title

Pat*_*ald 313

<xsl:if test="xpath-expression">...</xsl:if>
Run Code Online (Sandbox Code Playgroud)

所以例如

<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>
Run Code Online (Sandbox Code Playgroud)

  • 鉴于该问题没有明确规定使用XSLT,因此对如此高的评级感到惊讶. (40认同)
  • @SearchForKnowledge,你应该问这个作为SO的一个新问题,但作为一个快速指南:`html/body而不是(html/body/node())`(即,只测试它是否存在且不包含任何子节点或文本节点). (3认同)

小智 69

请尝试以下表达式: boolean(path-to-node)

  • 这正是我在Python中使用XPath和lxml时所需要的. (3认同)
  • 这是正确的答案,因为这实际上是一个XPath查询,与大多数其他答案不同. (3认同)

gkr*_*ers 47

帕特里克是正确的,无论是在使用中xsl:if,还是在语法中检查节点是否存在.然而,正如帕特里克的反应所暗示的那样,没有xsl等同于if-then-else,所以如果你正在寻找更像if-then-else的东西,你通常最好不要使用xsl:choosexsl:otherwise.因此,Patrick的示例语法将起作用,但这是另一种选择:

<xsl:choose>
 <xsl:when test="/html/body">body node exists</xsl:when>
 <xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>
Run Code Online (Sandbox Code Playgroud)

  • @Abhishek是的,你可以把更多的xsl:与其他条件放在一起并且有一个多分支语句.可以把它想象成一个SELECT而不是if-then-else,用xsl:否则作为默认值: (3认同)

dav*_*pcj 13

可能更好地使用选择,不必多次输入(或可能错误)您的表达式,并允许您遵循其他不同的行为.

我经常使用count(/html/body) = 0,因为节点的特定数量比集合更有趣.例如......当出现意外多于1个与您的表达式匹配的节点时.

<xsl:choose>
    <xsl:when test="/html/body">
         <!-- Found the node(s) -->
    </xsl:when>
    <!-- more xsl:when here, if needed -->
    <xsl:otherwise>
         <!-- No node exists -->
    </xsl:otherwise>
</xsl:choose>
Run Code Online (Sandbox Code Playgroud)