2009-08-21 8 views
7

J'ai une fonction XSLT qui vérifie si le paramètre envoyé est au format AAAAMMJJ ou non. Dans certaines conditions, je ne reçois aucune valeur à la fonction, au cours de ces conditions SAXON jette ci-dessous erreurTraitement de la séquence vide dans la fonction XSLT

« Une séquence ne peut être vide comme premier argument de cda: isValidDate() »

Des suggestions pour gérer cette situation?

Répondre

12

Dans XSLT, il n'y a pas de valeur Null. Pour représenter une valeur manquante, vous pouvez utiliser une chaîne de longueur nulle ou une séquence vide. Ils ne sont pas la même chose - une séquence vide retournera 0 de count ($ x) mais une chaîne de longueur zéro est une séquence contenant un élément de type xs: string qui a une longueur de chaîne de 0 (count ($ x) = 1 et string-length ($ x) = 0).

La plupart des fonctions XPath standard acceptent une chaîne de longueur nulle ou une séquence vide, mais votre fonction personnalisée peut ne pas l'être.

Le problème peut se produire si vous sélectionnez la séquence de caractères. Par exemple, si vous sélectionnez la valeur d'un nœud qui contient la chaîne, le nœud n'existe pas, vous obtiendrez une séquence vide - mais si le nœud existe et que la valeur est vide, vous obtiendrez la chaîne vide.

Modifiez la façon dont vous sélectionnez la valeur pour avoir toujours la chaîne vide (ou retournez/modifiez la fonction isValidDate pour accepter la séquence vide). La fonction suivante acceptera la séquence vide et la convertira en une chaîne de longueur zéro

<xsl:function name="cda:isValidDate" as="xs:boolean"> 
    <xsl:param name="datestring" as="xs:string?"/> 
    <xsl:variable name="reallyastring" select="string($datestring)"/> 
    Your code 
</xsl:function> 

Le? sur le xs: chaîne? Le type de paramètre permet à un ou aucun article d'être fourni. La fonction string (...) ne renvoie jamais une chaîne vide, donc convertira la séquence vide en une chaîne de longueur nulle.

+1

Ou utilisez 'xs: choose' pour vérifier si la séquence est vide (' count() = 0') avant d'appeler la fonction. –

+0

comment je peux déclarer ma fonction pour accepter la séquence vide? existe-t-il un type de données pour cela? –

+0

Avoir mis à jour la réponse pour montrer comment accepter la séquence vide et la convertir en chaîne de longueur zéro. –

Questions connexes