[英]return whole element using except() using 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
,這次的輸出包括了父標記,但是在子標記上也包含了“ color”。 任何想法?
在普通的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 Update擴展,您還可以刪除不需要的節點,而將其復制)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.