2011-01-11 51 views
3

我正在尋找一些指導,讓我朝着正確的方向前進。我正在使用xquery返回一個與下面的xml類似的xml文檔。XQuery來過濾行的動態列表

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

這是可行的?任何可能使我指向正確方向的建議都會受到重視。

+0

好問題,+1。查看我的答案,獲取完整而簡短的解決方案。 :) – 2011-01-12 04:19:56

回答

1

這類問題更適合於XSLT,但它也可以在XQuery中解決它們。

事情是這樣的

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

想要的,正確的結果產生

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="three">ccc</myElement> </myElements> <myElements id="2"> <myElement key="one">ddd</myElement> <myElement key="three">fff</myElement> </myElements> </myDoc> 
+0

謝謝Dimitre。你的答案是現貨。 – xelco52 2011-01-12 21:07:37