XQuery过滤动态行列表

时间:2011-01-11 23:33:12

标签: xml xquery

我正在寻找一些指导,让我朝着正确的方向前进。我正在使用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>节来返回文档。例如,如果指定了键“one”和“three”,则生成的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 个答案:

答案 0 :(得分:1)

这类问题更适合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>