web-dev-qa-db-fra.com

xsl: si au moins un noeud enfant existe

<node>
   <node1><node11/></node1>
   <node2/>
</node>

Je veux que mon XSLT vérifie

<xsl:if test="If at least 1 child node exists">
  Only node1 can pass the if condition
</xsl:if>

Merci pour toute réponse.

14
Tran Ngu Dang

Tout d'abord, soyez prudent avec votre terminologie ici. Voulez-vous dire "noeud" ou voulez-vous dire "élément". Un nœud peut être un élément, un commentaire, un texte ou une instruction de traitement. 

Quoi qu'il en soit, si vous voulez dire élément ici, pour vérifier qu'au moins un élément enfant existe, vous pouvez simplement le faire (en supposant que vous êtes positionné sur l'élément node dans ce cas.

<xsl:if test="*">

Votre commentaire suggère que seul "node1" puisse passer la condition if, aussi pour vérifier l'existence d'un élément spécifique

<xsl:if test="node1">
26
Tim C

Dans le contexte du nœud que vous testez, cela devrait permettre de vérifier si un nœud a des éléments enfant éléments :

<xsl:if test="*">
  Only node1 can pass the if condition
</xsl:if>

Si vous vouliez réellement parler de nœuds (qui incluraient des nœuds de texte), vous utiliseriez des nœuds de texte:

<xsl:if test="node()">
  Only node1 can pass the if condition
</xsl:if>

Mais <node> passerait également ce test (<node2> ne le ferait pas). J'ai supposé que vous ne parliez que dans le contexte des nœuds enfants de <node>, mais peut-être pas?

5
JLRishe

Les expressions qui correspondent à un nœud sont véridiques, alors que les expressions qui ne correspondent à rien sont fausses, ainsi:

<xsl:if test="node()">
   ...
</xsl:if>

Cependant, votre question et la condition implicite "Seul le nœud 1 peut passer la condition if" sont en désaccord avec l'exemple. node et node1 ont tous les deux des noeuds enfant. Par conséquent, les deux transmettent cette condition if.

Pour le limiter strictement à node1, vous devez vous assurer que le contexte du modèle est approprié ou vérifier que le nœud en question n'est pas le documentElement.

0
Paul Butcher

Le libellé de la question n'est pas clair, mais je pense que vous voulez simplement traiter les nœuds enfants qui ont eux-mêmes des enfants (c.-à-d. Les petits-enfants du nœud actuel).

<xsl:template match="node">
 do stuff for node
  <xsl:apply-templates select="*[*]"/>
</xsl:template>

appliquera simplement des modèles à node1 car il a un nœud enfant, il n'appliquera pas de modèles à node2.

0
David Carlisle