À l'aide d'une requête xpath, comment savoir s'il existe un nœud (balise)?
Par exemple, si je devais m'assurer qu'une page de site Web a la structure de base correcte comme / html / body et / html / head / title
À l'aide d'une requête xpath, comment savoir s'il existe un nœud (balise)?
Par exemple, si je devais m'assurer qu'une page de site Web a la structure de base correcte comme / html / body et / html / head / title
Réponses:
<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>
html/body and not(html/body/node())
(c'est-à-dire, testez simplement si elle existe et qu'elle ne contient aucun nœud enfant ou nœud texte).
Essayez l'expression suivante: boolean(path-to-node)
Patrick a raison, à la fois dans l'utilisation de xsl:if
et dans la syntaxe pour vérifier l'existence d'un nœud. Cependant, comme l'indique la réponse de Patrick, il n'y a pas de xsl équivalent à if-then-else, donc si vous cherchez quelque chose de plus comme un if-then-else, il vaut mieux utiliser xsl:choose
et et xsl:otherwise
. Ainsi, l'exemple de syntaxe de Patrick fonctionnera, mais ceci est une alternative:
<xsl:choose>
<xsl:when test="/html/body">body node exists</xsl:when>
<xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>
if-then-else
, qu'en est-il également if-else if-else
? Dans la réponse de davenpcj, puis-je placer test="somexpath"
dans le 2e quand le faire if-else if-else
?
Il pourrait être préférable d'utiliser un choix, de ne pas avoir à taper (ou peut-être de mal saisir) vos expressions plus d'une fois et vous permet de suivre des comportements différents supplémentaires.
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 ... quand 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>
count(/html/body) = 0
génie! : DI l'utilise comme /html[count(/body)=0]/someNode
pour sélectionner someNode
quand /body
(ou autre) est manquant
/html[count(/body)=0]
ne sélectionnera jamais rien, il ne peut pas y avoir deux nœuds racine en XML. Peut-être que vous vouliez dire /html[count(body)=0]
, ce qui serait le même que /html[not(body)]
, ou /html[not(exists(body))]
.
Je travaille en Ruby et en utilisant Nokogiri, je récupère 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 en Java en utilisant count ():
int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
// body node missing
}