Comment puis-je vérifier si une valeur est nulle ou vide avec XSL ?
Par exemple, si categoryName
est vide? J'utilise un lors du choix de la construction.
Par exemple:
<xsl:choose>
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="other" />
</xsl:otherwise>
</xsl:choose>
xsl:when
pour les tests de nœuds. Considérez<xsl:template match="Category[categoryName[not(node())]]">...
avec un<xsl:template match="Category">...
. Le processeur prendra alors les bonnes décisions pour vous et vous n'aurez plus besoin d'écrire la logique métier imbriquéexsl:choose
. Dans de nombreux cas, l'utilisation de modèles correspondants facilite la rédaction de feuilles de style.Réponses:
Edit : Cela couvre l'interprétation la plus probable, à mon avis, de "[pas] nul ou vide" comme déduit de la question, y compris son pseudo-code et ma propre première expérience avec XSLT. C'est-à-dire, "Quel est l'équivalent du Java suivant?":
Pour plus de détails, par exemple, identifier distinctement null vs vide, voir la réponse de johnvey ci - dessous et / ou le `` violon '' XSLT que j'ai adapté de cette réponse, qui inclut l'option dans le commentaire de Michael Kay ainsi que la sixième interprétation possible.
la source
test="not(categoryName = '')"
. La réponse fournie retournera false si l'élément categoryName est absent, ce qui, dans mon interprétation de la question, en fait une mauvaise réponse.<xsl:for-each select="root/*[matches(name(.), 'grp')]">
pour qu'il puisse être utilisé dans VS2010?En l'absence de toute autre information, je suppose que le XML suivant:
Un exemple d'utilisation ressemblerait à ceci:
la source
</CategoryName>
? , les tests de chaînes vides ne fonctionnent pas pour cela</CategoryName>
, ni aucun besoin.De l' élément vide :
Pour tester si la valeur d'un certain nœud est vide
Cela dépend de ce que vous entendez par vide.
not(node())
not(string(.))
not(normalize-space(.))
not(node()[not(self::comment())])
la source
not(text())
. Une alternative à votre 2ème puce est égalementnot(.//text())
. Comme le montre votre dernière puce: il existe de nombreuses façons de considérer le "néant";).if ($mystring) then ... else ...
Qu'en est-il de?
la source
<categoryName> <!-- some comment --> </categoryName>
et sinon aucun texte significatif, celatrue
Les deux premiers traitent avec une valeur nulle et les deux autres traitent avec une chaîne vide.
la source
xsl:apply-templates
et associez des modèles pour obtenir ce que vous voulez, beaucoup plus facilement.Dans certains cas, vous souhaiterez peut-être savoir quand la valeur est spécifiquement nulle, ce qui est particulièrement nécessaire lors de l'utilisation de XML qui a été sérialisé à partir d'objets .NET. Bien que la réponse acceptée fonctionne pour cela, elle renvoie également le même résultat lorsque la chaîne est vide ou vide, c'est-à-dire '', vous ne pouvez donc pas faire de différence.
Vous pouvez donc simplement tester l'attribut.
Parfois, il est nécessaire de connaître l'état exact et vous ne pouvez pas simplement vérifier si CategoryName est instancié, car contrairement à dire Javascript
Renvoie true pour un élément null.
la source
Je sais que cette question est ancienne, mais entre toutes les réponses, je manque celle qui est une approche courante pour ce cas d'utilisation dans le développement XSLT.
J'imagine que le code manquant de l'OP ressemble à ceci:
Et que l'entrée ressemble à ceci:
C'est-à-dire que je suppose qu'il peut y avoir zéro, vide, un seul
categoryName
élément ou plusieurs éléments. Traiter tous ces cas en utilisantxsl:choose
des constructions -style, ou en d'autres termes, impérativement, devient rapidement compliqué (encore plus si les éléments peuvent être à différents niveaux!). Un idiome de programmation typique dans XSLT utilise des modèles (d'où le T dans XSLT), qui est une programmation déclarative, pas impérative (vous ne dites pas au processeur quoi faire, vous dites simplement ce que vous voulez sortir si certaines conditions sont remplies). Pour ce cas d'utilisation, cela peut ressembler à ceci:Cela fonctionne (avec n'importe quelle version XSLT), car la première ci-dessus a une priorité plus élevée (elle a un prédicat). Le modèle de correspondance "fall-through", le second, capture tout ce qui n'est pas valide. Le troisième se charge ensuite de sortir le
categoryName
valeur de manière appropriée.Notez que dans ce scénario, il n'est pas nécessaire de faire correspondre spécifiquement
categories
oucategory
, car le processeur traitera automatiquement tous les enfants, sauf indication contraire (dans cet exemple, les deuxième et troisième modèles ne traitent pas davantage les enfants, car il n'y a pasxsl:apply-templates
dans leur).Cette approche est plus facilement extensible que l'approche impérative, car elle traite automatiquement plusieurs catégories et peut être développée pour d'autres éléments ou exceptions en ajoutant simplement un autre modèle correspondant. Programmation sans if-branches .
Remarque: il n'y a rien de tel qu'en
null
XML. Il existe xsi: nil , mais il est rarement utilisé, surtout rarement dans des scénarios non typés sans schéma d'aucune sorte.la source
C'est probablement l'expression XPath la plus simple (celle de la réponse acceptée fournit un test pour le contraire, et serait plus longue si elle était annulée):
Explication :
L'argument de la
not()
fonction ci-dessus estfalse()
exactement lorsqu'il n'y a pas d'categoryName
enfant ("null") de l'élément de contexte, ou lorsque l' enfant (unique)categoryName
a une valeur de chaîne - la chaîne vide.Dans XSLT 2.0, utilisez :
Voici un exemple complet :
Lorsque cette transformation est appliquée sur le document XML suivant:
le résultat voulu et correct est produit :
Lorsqu'il est appliqué sur ce document XML :
ou sur ceci:
ou sur ce
le résultat correct est produit :
De même, utilisez cette transformation XSLT 1.0 :
Notez : aucun conditionnel n'est utilisé. En savoir plus sur l'importance d'éviter les constructions conditionnelles dans ce joli cours Pluralsight:
" Modèles de conception tactique dans .NET: flux de contrôle "
la source
S'il y a une possibilité que l'élément n'existe pas dans le XML, je testerais à la fois que l'élément est présent et que la longueur de chaîne est supérieure à zéro:
la source
categoryName
vous donne lorsqu'il n'y a aucuncategoryName
élément enfant dans le contexte actuel) est définie comme étant la chaîne vide, donc c'est redondant -string-length(categoryName)
est zéro s'il n'y a pas d'categoryName
éléments.Si un nœud n'a aucune valeur disponible dans le xml d'entrée comme ci-dessous xpath,
La fonction string () est convertie en valeur vide. Donc ça marche bien:
la source
Quelque chose comme ça fonctionne pour moi:
Ou l'inverse:
Remarque: Si vous ne vérifiez pas les valeurs nulles ou ne gérez pas les valeurs nulles, IE7 renvoie -2147483648 au lieu de NaN.
la source
J'ai trouvé qu'il valait mieux juste tester la longueur de la chaîne car plusieurs fois le champ n'est pas nul, juste vide
la source
D'après mon expérience, le meilleur moyen est:
la source
Utilisez simple categoryName / text () Un tel test fonctionne très bien
<categoryName/>
aussi<categoryName></categoryName>
.la source