簡體   English   中英

使用xquery使用except()返回整個元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM