Je dois tester 3 attributs d'un nœud. Le problème est que je dois retourner une erreur pour chaque attribut d'erreur et je ne vois pas comment atteindre cela de manière simple.
xquery n'est pas vraiment flexible, donc ... pas tellement d'essayer ... P >
for $theHoldingListsField in //DisplaySettingCol/theDisplaySetting/theHoldingListsFields return if ($theHoldingListsField/@AFL != "MANDATORY") then ( <error id="DPR-CKSEM-DEP-SMF142-2"> <args> <arg value="{$theHoldingListsField/ancestor::node()/@id}"/> <arg value="AFL = {$theHoldingListsField/@AFL}"/> </args> <location value="{functx:path-to-node-with-pos($theHoldingListsField)}"/> </error> ) else if ($theHoldingListsField/@attitudeIndicator != "MANDATORY") then ( <error id="DPR-CKSEM-DEP-SMF142-2"> <args> <arg value="{$theHoldingListsField/ancestor::node()/@id}"/> <arg value="attitudeIndicator = {$theHoldingListsField/@attitudeIndicator}"/> </args> <location value="{functx:path-to-node-with-pos($theHoldingListsField)}"/> </error> )
3 Réponses :
Il n'y a pas de Si vous souhaitez renvoyer une séquence vide lorsque la condition d'erreur n'est pas remplie, vous pouvez le faire explicitement, séparément pour chaque erreur. Vous pouvez ensuite rassembler toutes les séquences zéro ou un élément en un, qui est automatiquement aplatie: p> si code> sans
sinon code> dans Standard XQuery, puisque
si code> /
(code> /
/
/
/
code> est une expression em> qui doit évaluer à une valeur de retour dans tous les cas (voir Programmation fonctionnelle ).
Une autre option consiste à adopter une approche de programmation plus fonctionnelle.
Nous pouvons généraliser votre test dans une fonction qui fonctionne sur un Nous boucons essentiellement sur les attributs (avec des codes d'erreur) que vous souhaitez Testez et appelez le L'exemple ci-dessus utilise des fonctionnalités XQuery 3.1 telles que des tableaux ( Ceci pourrait également être réécrit pour supprimer le TholdingListsfield code> car il n'a que deux invariants, le nom de l'attribut (
$ attr nom code>) et le code d'erreur (
$ ERROR-ID code>). p>
local: Test code> Fonction sur chacun, par exemple p>
[] code>), application de fonction partielle (
? code>), opérateur de carte simple (
! code>) et fonctions de commande supérieure (
fn: appliquer < / code>). Je suggérerais d'apprendre à propos de ceux de la spécification XQuery 3.1 W3C. P>
pour code> et avoir le
local: test code > fonction fonctionne sur tous les champs (c.-à-d.
TholdingLislicsFields code>). P> P>
Commencez par mettre le code répété dans une fonction: puis votre logique réduit à p>
Je ne suis pas capable de comprendre ce que vous voulez réaliser. Dans XQuery standard, un
si code> expression a toujours une branche code> sinon code> mais vous pouvez utiliser par exemple.
Si (Condition) Puis Someresult () Code> Pour que la branche
el / code> renvoie une séquence vide. Si vous souhaitez utiliser cette erreur code> ELLE CODE> comme une sorte de "modèle", cela pourrait aider à écrire une fonction de prendre un nœud d'attribut et / ou de son élément parent comme paramètres, puis à l'intérieur de la fonction que vous pouvez paramétriser La condition et bien sûr la création de l'élément de résultat code> d'erreur code>.