XQuery для фильтрации динамического списка строк - PullRequest
3 голосов
/ 12 января 2011

Я ищу руководство, чтобы заставить меня двигаться в правильном направлении. Я использую xquery для возврата XML-документа, который похож на XML ниже.

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

Я пытаюсь вернуть документ только с определенными строфами <myElements>, ключ которых указан. Например, если указаны ключи «один» и «три», результирующий xml должен выглядеть следующим образом:

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

Это возможно? любой совет, который мог бы указать мне правильное направление, был бы очень признателен.

1 Ответ

1 голос
/ 12 января 2011

Проблемы такого рода гораздо больше подходят для XSLT, но их также можно решить в XQuery.

Примерно так :

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

когда этот запрос выполняется к предоставленному документу XML :

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

желаемый, правильный результат получается :

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