Vérifiez si une chaîne est nulle ou vide dans XSLT

Comment puis-je vérifier si une valeur est nulle ou vide avec XSL ?

Par exemple, si categoryName est vide? J’utilise un choix lors de la construction.

Par exemple:

         

 test="categoryName != ''" 

Edit : Cela couvre l’interprétation la plus probable, à mon avis, de «[pas] nul ou vide» tel que déduit de la question, y compris son pseudo-code et ma propre première expérience avec XSLT. Ie, “Qu’est-ce que l’équivalent du Java suivant?”:

 !(categoryName == null || categoryName.equals("")) 

Pour plus de détails, par exemple identifier distinctement null ou 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 du commentaire de Michael Kay et la sixième interprétation possible.

En l’absence de toute autre information, je supposerai le code XML suivant:

   item 1 blue   item 2    item 3  ...  

Un exemple d’utilisation ressemblerait à ceci:

               

De l’ élément vide :

Pour tester si la valeur d’un certain noeud est vide

Cela dépend de ce que vous entendez par vide.

  • Ne contient aucun nœud enfant: not(node())
  • Ne contient aucun contenu textuel: not(ssortingng(.))
  • Ne contient aucun texte autre que les espaces: not(normalize-space(.))
  • not(node()[not(self::comment())]) contient rien sauf les commentaires: not(node()[not(self::comment())])

Qu’en est-il de?

 test="not(normalize-space(categoryName)='')" 

Les deux premiers traitent de la valeur NULL et le second traite de la chaîne vide.

  USERNAME is not null   USERNAME is null   USERNAME is empty ssortingng   USERNAME is not empty ssortingng  

Dans certains cas, vous pouvez vouloir savoir quand la valeur est spécifiquement null, ce qui est particulièrement nécessaire lors de l’utilisation de XML sérialisé à partir d’objects .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 que vous ne pouvez pas différencier.

   item 1    

Donc, vous pouvez simplement tester l’atsortingbut.

  Hello World.  

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

  Hello World.  

Renvoie true pour un élément null.

Je sais que cette question est ancienne, mais entre toutes les réponses, il me manque une approche commune 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:

   Books   Magazines Periodicals Journals          

C’est-à-dire que je suppose qu’il peut y avoir zéro, vide, simple ou plusieurs éléments categoryName . Traiter tous ces cas en utilisant xsl:choose des constructions de style, ou en d’autres termes, impérativement, devient rapidement désordonné (encore plus si les éléments peuvent être à des niveaux différents!). Un langage de programmation typique dans XSLT utilise des modèles (d’où le T dans XSLT), qui est une programmation déclarative, non impérative (vous ne dites pas au processeur quoi faire, vous dites simplement ce que vous voulez produire si certaines conditions sont remplies). Pour ce cas d’utilisation, cela peut ressembler à ceci:

       Category: Other    Category:    

Cela fonctionne (avec n’importe quelle version de XSLT), car le premier ci-dessus a une priorité plus élevée (il a un prédicat). Le gabarit correspondant, le second, intercepte tout ce qui n’est pas valide. Le troisième prend alors en charge la sortie de la valeur categoryName de manière appropriée.

Notez que dans ce scénario, il n’est pas nécessaire de faire correspondre spécifiquement les categories ou les category , car le processeur traitera automatiquement tous les enfants, sauf indication contraire (dans cet exemple, le deuxième et le troisième modèle ne traitent pas les enfants). aucun xsl:apply-templates en eux).

Cette approche est plus facilement extensible que l’approche impérative, car elle traite automatiquement de plusieurs catégories et peut être étendue à d’autres éléments ou exceptions en ajoutant simplement un autre modèle correspondant. Programmation sans if-twigs .

Note: Nul n’existe dans XML. Il y a xsi: nil , mais cela est rarement utilisé, en particulier dans des scénarios non typés sans schéma quelconque.

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 la chaîne est supérieure à zéro:

         

Si un noeud n’a pas de valeur disponible dans le xml d’entrée comme ci-dessous xpath,

    

La fonction ssortingng () convertit en valeur vide. Donc ça marche bien:

 ssortingng(/Node/ErrorCode) ='' 

Quelque chose comme ça fonctionne pour moi:

   -      

Ou l’inverse:

      -   

Remarque: Si vous ne vérifiez pas les valeurs NULL ou gérez les valeurs NULL, IE7 renvoie -2147483648 au lieu de NaN.

Comment puis-je vérifier si une valeur est nulle ou vide avec XSL?

Par exemple, si categoryName est vide?

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 est annulée):

 not(ssortingng(categoryName)) 

Explication :

L’argument de la fonction not() ci-dessus est false() exactement lorsqu’il n’y a pas d’enfant categoryName (“null”) de l’élément de contexte, ou que l’enfant (unique) categoryName a une valeur de chaîne – la chaîne vide.

J’utilise un choix lors de la construction.

Par exemple:

         

Dans XSLT 2.0, utilisez :

  

Voici un exemple complet :

        

Lorsque cette transformation est appliquée sur le document XML suivant:

 X 

le résultat recherché est produit :

 X 

Appliqué sur ce document XML :

  

ou sur ceci:

  

ou sur ce

 Y 

le résultat correct est produit :

 Other 

De même, utilisez cette transformation XSLT 1.0 :

        

Remarque : aucun conditionnel n’est utilisé. En savoir plus sur l’importance d’éviter les constructions conditionnelles dans ce beau parcours Pluralsight:

Modèles de conception tactique dans .NET: stream de contrôle

Selon mon expérience, le meilleur moyen est:

       

Utilisez simple categoryName / text () Ce test fonctionne bien sur et .

         

En fait, j’ai trouvé qu’il était préférable de tester la longueur des chaînes, car plusieurs fois le champ n’est pas nul, il suffit de le vider.