3 votes

XQuery pour filtrer une liste dynamique de lignes

Je cherche des conseils pour m'aider à avancer dans la bonne direction. J'utilise xquery pour retourner un document xml qui ressemble au xml ci-dessous.

<myDoc>
  <myElements id="1">
    <myElement key="one">aaa</myElement>
    <myElement key="two" >bbb</myElement>
    <myElement key="three">ccc</myElement>
  </myElements>
  <myElements id="2">
    <myElement key="one">ddd</myElement>
    <myElement key="two" >eee</myElement>
    <myElement key="three">fff</myElement>
  </myElements>
</myDoc>

J'essaie de renvoyer le document avec seulement les éléments spécifiques suivants <myElements> les strophes dont la clé est spécifiée. Par exemple, si les clés "un" et "trois" sont spécifiées, le xml résultant devrait ressembler à ceci :

<myDoc>
  <myElements id="1">
    <myElement key="one">aaa</myElement>
    <myElement key="three">ccc</myElement>
  </myElements>
  <myElements id="2">
    <myElement key="one">ddd</myElement>
    <myElement key="three">fff</myElement>
  </myElements>
</myDoc>

Est-ce faisable ? Tout conseil qui pourrait m'orienter dans la bonne direction serait très apprécié.

1voto

Dimitre Novatchev Points 147842

Les problèmes de ce type sont beaucoup plus adaptés à XSLT, mais il est également possible de les résoudre en XQuery.

Quelque chose comme ça :

let $vKeys := ('one', 'three')
 return
   element {name(/*)}
     {for $child in /*/*
       return
        element {name($child)} 
          {for $att in $child/@*
            return
             attribute {name($att)} {$att},
           for $grandchild in $child/myElement[@key=$vKeys]
             return $grandchild
          }
     }

lorsque cette requête est exécutée contre le document XML fourni :

<myDoc>
  <myElements id="1">
    <myElement key="one">aaa</myElement>
    <myElement key="two" >bbb</myElement>
    <myElement key="three">ccc</myElement>
  </myElements>
  <myElements id="2">
    <myElement key="one">ddd</myElement>
    <myElement key="two" >eee</myElement>
    <myElement key="three">fff</myElement>
  </myElements>
</myDoc>

le résultat voulu et correct est produit :

<myDoc>
   <myElements id="1">
      <myElement key="one">aaa</myElement>
      <myElement key="three">ccc</myElement>
   </myElements>
   <myElements id="2">
      <myElement key="one">ddd</myElement>
      <myElement key="three">fff</myElement>
   </myElements>
</myDoc>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X