2017-09-14 2 views
1

J'utilise la capacité de MarkLogic à appeler les fonctions XQuery dans la transformation XSL. Disons que j'ai une bibliothèque XQuery avec une fonction dont la signature ressemble à ce qui suit. Ceci est à titre illustratif seulement.Coercion invalide:() en tant que xs: string en xdmp: xslt-eval

declare function my-func:ex-join($first as xs:string, $last as xs:string) as xs:string 
{ 
    fn:concat($first, '-', $last) 
} 

De XQuery, je peux appeler cette fonction avec la séquence vide en tant que paramètres, sans problème, à savoir

ex-join((), '1244') 

La fonction juste retour une séquence vide, mais je ne reçois pas d'erreurs . Si je tente de toute cette fonction de dans mon transformation XSL, comme dans:

<xsl:value-of select="my-func:ex-join(//node/value/text(), 'something')"/> 

Si le /nœud/valeur n'existe pas, et une séquence vide est transmis, je reçois l'erreur de coercition.

Est-ce que quelqu'un a des suggestions pour contourner le problème de coercition, en dehors de vérifier les valeurs dans XSL avant le select? Ce sont des modèles XSL générés automatiquement, ce qui signifie beaucoup de contrôles codés.

Merci,

-TJ

Répondre

2

Les tentatives d'invoquer cette fonction dans XQuery échouerait aussi. C'est probablement à cause de la cartographie des fonctions que vous ne le remarquez pas. Mettez les éléments suivants en haut de votre code XQuery:

declare option xdmp:mapping "false"; 

À côté de cela, il vous suffit de changer la signature de votre fonction d'accepter vides-séquences. Remplacer as xs:string avec as xs:string?:

declare function my-func:ex-join($first as xs:string?, $last as xs:string?) as xs:string 

fn:concat acceptera des séquences vides comme arguments, donc pas d'autres changements nécessaires pour le faire fonctionner ..

HTH!

+0

Merci @grtjn. Cela a résolu mon problème. –