【问题标题】:XQuery to filter dynamic list of rowsXQuery 过滤动态行列表
【发布时间】:2011-01-11 23:33:11
【问题描述】:

我正在寻找一些指导,让我朝着正确的方向前进。我正在使用 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>

我正在尝试仅返回带有指定密钥的特定 &lt;myElements&gt; 节的文档。例如,如果指定了键“一”和“三”,则生成的 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。请参阅我的答案以获得完整而简短的解决方案。 :)

标签: xml xquery


【解决方案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>

【讨论】:

  • 谢谢迪米特。你的答案是正确的。
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 2012-02-04
  • 2020-01-18
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多