En utilisant une requête xpath, comment trouver si un nœud (une balise) existe?
Par exemple, si j'avais besoin de m'assurer qu'une page de site Web a la structure de base correcte, telle que/html/body et/html/head/title
<xsl:if test="xpath-expression">...</xsl:if>
donc par exemple
<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>
Essayez l'expression suivante: boolean(path-to-node)
Patrick a raison, à la fois dans l'utilisation du xsl:if
et dans la syntaxe permettant de vérifier l'existence d'un nœud. Cependant, comme le suggère la réponse de Patrick, il n'y a pas d'équivalent xsl à if-then-else, donc si vous recherchez quelque chose qui ressemble davantage à un if-then-else, vous ferez normalement mieux d'utiliser xsl:choose
et xsl:otherwise
. Ainsi, l'exemple de syntaxe de Patrick fonctionnera, mais c'est une alternative:
<xsl:choose>
<xsl:when test="/html/body">body node exists</xsl:when>
<xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>
Il serait peut-être préférable d’utiliser un choix, de ne pas avoir à taper (ou peut-être de manière erronée) vos expressions plus d’une fois, et vous permet de suivre d’autres comportements différents.
J'utilise très souvent count(/html/body) = 0
, car le nombre spécifique de nœuds est plus intéressant que l'ensemble. Par exemple ... lorsqu'il y a de manière inattendue plus d'un nœud qui correspond à votre expression.
<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>
Je travaille dans Ruby et avec Nokogiri, je vais chercher l'élément et regarde si le résultat est nul.
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?
Une variation lors de l'utilisation de xpath dans Java à l'aide de count ():
int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
// body node missing
}