0
votes

Y a-t-il un moyen d'avoir plusieurs personnes si sans autre?

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>
        )


1 commentaires

Je ne suis pas capable de comprendre ce que vous voulez réaliser. Dans XQuery standard, un si expression a toujours une branche sinon mais vous pouvez utiliser par exemple. Si (Condition) Puis Someresult () Pour que la branche el / code> renvoie une séquence vide. Si vous souhaitez utiliser cette erreur ELLE 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 d'erreur .


3 Réponses :


2
votes

Il n'y a pas de si sans sinon dans Standard XQuery, puisque si / (code> / / / / est une expression qui doit évaluer à une valeur de retour dans tous les cas (voir Programmation fonctionnelle ).

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: xxx


0 commentaires

2
votes

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 TholdingListsfield car il n'a que deux invariants, le nom de l'attribut ( $ attr nom ) et le code d'erreur ( $ ERROR-ID ).

Nous boucons essentiellement sur les attributs (avec des codes d'erreur) que vous souhaitez Testez et appelez le local: Test Fonction sur chacun, par exemple xxx

L'exemple ci-dessus utilise des fonctionnalités XQuery 3.1 telles que des tableaux ( [] ), application de fonction partielle (? ), opérateur de carte simple (! ) 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.

Ceci pourrait également être réécrit pour supprimer le pour et avoir le local: test fonction fonctionne sur tous les champs (c.-à-d. TholdingLislicsFields ).


0 commentaires

4
votes

Commencez par mettre le code répété dans une fonction: xxx

puis votre logique réduit à xxx


0 commentaires