XPath查找节点是否存在

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

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

355069 次浏览
<xsl:if test="xpath-expression">...</xsl:if>

例如,

<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>

在Java中使用count()使用xpath时的一个变体:

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
// body node missing
}

试试下面的表达式:boolean(path-to-node)

使用一个选项可能会更好,不必键入(或可能键入错误)你的表达式不止一次,并允许你遵循其他不同的行为。

我经常使用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>

Patrick是正确的,无论是在xsl:if的使用上,还是在检查节点存在的语法上。然而,正如Patrick的回答所暗示的那样,没有与if-then-else等价的xsl,因此如果您正在寻找更类似于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>

我在Ruby中工作,使用Nokogiri我获取元素,看看结果是否为nil。

require 'nokogiri'


url = "http://somthing.com/resource"


resp = Nokogiri::XML(open(url))


first_name = resp.xpath("/movies/actors/actor[1]/first-name")


puts "first-name not found" if first_name.nil?