2014-08-30 106 views
0

目前我正在做一些像下面的xquery。使用除()使用xquery返回整個元素

XML文檔:

<?xml version="1.0" encoding="UTF-8"?> 
<animal> 
    <dog name="ada"> 
     <color>black</color> 
     <byear>2012</byear> 
    </dog> 
    <dog name="bob"> 
     <color>black</color> 
     <byear>2011</byear> 
    </dog> 
    <cat name="cathy"> 
     <color>black</color> 
     <byear>2010</byear> 
    </cat> 
    <cat name="dione"> 
     <color>brown</color> 
     <byear>2009</byear> 
    </cat> 
</animal> 

預期輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<animal> 
    <color>black</color> 
    <dog name="ada"> 
     <byear>2012</byear> 
    </dog> 
    <dog name="bob"> 
     <byear>2011</byear> 
    </dog> 
    <cat name="cathy"> 
     <byear>2010</byear> 
    </cat> 
</animal> 

我的代碼如下所示:

<animal> 
{ for $a in distinct-values(//animal/*/color) 
    return <color>{$a}</color> 
    { for $b in //animal/*[color=$a] 
    where $b//color="black" 
     return $b/* except $b/color 
</animal> 

和輸出是好的,但它不包括父標籤(例如<dog name="ada"> </dog>)。

此外,我也嘗試了類似return $b except $b/color的東西,這次的輸出包含了父標記,但它也包含了子標記上的「顏色」。任何想法?

回答

1

在正常的XQuery中,你不能只返回一個節點的一部分。您可以返回整個節點及其所有子節點/子節點,也可以選擇一些子節點/子節點並完全返回這些節點。

您可以改爲使用element {node-name(...)} {...}創建一個與舊節點具有相同名稱的新節點,然後將所需的子節點從舊節點複製到新節點。

喜歡的東西:

<animal> 
{ for $a in distinct-values(//animal/*/color) 
    return (
     <color>{$a}</color>, 
     for $b in //animal/*[color=$a] 
     return element {node-name($b)} {$b/@*, $b/node() except $b/color } 
    ) 
} 
</animal> 

(隨着XQuery更新擴展,你也可以刪除你不想要,而不是將它們複製節點)