209 votes

XPath trouver si le noeud existe

À l'aide d'une requête XPath, comment trouver si un nœud (balise) existe vraiment ?

Par exemple, si j'avais besoin de m'assurer qu'une page de site Web a la structure de base correcte comme /html/body y /html/head/title .

0 votes

Peut-être est-il préférable d'utiliser le schéma XML avec indication des éléments obligatoires ? Ainsi, il serait possible de vérifier si un document l'utilise ou non.

333voto

Patrick McDonald Points 20645
<xsl:if test="xpath-expression">...</xsl:if>

Ainsi, par exemple

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

44 votes

Surpris d'une note aussi élevée étant donné que la question ne précise pas du tout l'utilisation de XSLT.

4 votes

@SearchForKnowledge, vous devriez probablement poser cette question comme une nouvelle question à SO, mais comme un guide rapide : html/body and not(html/body/node()) (c'est-à-dire qu'il suffit de tester s'il existe et s'il ne contient pas de noeuds enfants ou de noeuds de texte).

76voto

annesley Points 409

Essayez l'expression suivante : boolean(path-to-node)

3 votes

C'est exactement ce dont j'avais besoin pour utiliser XPath en Python avec lxml.

1 votes

Cela a fonctionné à merveille lors de l'élaboration de conditions de règles et d'actions de règles dans InfoPath 2010.

5 votes

C'est la bonne réponse dans le sens où il s'agit en fait d'une requête XPath, contrairement à la plupart des autres réponses.

51voto

gkrogers Points 4830

Patrick a raison, tant dans l'utilisation de la 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 d'équivalent xsl à if-then-else, donc si vous cherchez quelque chose qui ressemble plus à un if-then-else, il est normalement préférable d'utiliser xsl:choose y xsl:otherwise . Ainsi, la syntaxe de l'exemple de Patrick fonctionnera, mais voici une alternative :

<xsl:choose>
 <xsl:when test="/html/body">body node exists</xsl:when>
 <xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>

0 votes

+1 pour avoir noté if-then-else et que dire aussi de if-else if-else ? Dans la réponse de davenpcj puis-je placer test="somexpath" dans la deuxième partie pour faire if-else if-else ?

4 votes

@Abhishek Oui, vous pouvez mettre plus de xsl:when avec d'autres conditions et avoir une déclaration multi-branches. Pensez-y plus comme un SELECT que comme un if-then-else, avec xsl:otherwise comme défaut :.

0 votes

C'est génial mais que faire si je veux vérifier si elle existe OU si elle est vide ?

14voto

davenpcj Points 3424

Il est peut-être préférable d'utiliser un choix, ce qui évite d'avoir à taper (ou éventuellement à faire des erreurs) 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 inopinément 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>

0 votes

Comme indiqué dans le code ci-dessus, d'autres clauses xsl:when peuvent être ajoutées pour modifier le comportement et traiter plusieurs conditions de différentes manières.

0 votes

count(/html/body) = 0 Génie ! :D Je l'utilise comme /html[count(/body)=0]/someNode pour avoir sélectionné someNode quand /body (ou autre) est manquant

1 votes

@clickstefan, /html[count(/body)=0] ne sélectionnera jamais rien, il ne peut pas y avoir deux nœuds racine dans le XML. Vous vouliez peut-être dire /html[count(body)=0] ce qui revient à dire que /html[not(body)] ou /html[not(exists(body))] .

3voto

user324898 Points 21

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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X