2016-09-15 3 views
0

У меня есть XML-документ следующей структуры.Узлы XQuery с идентификационными значениями атрибутов

<Content> 
<Function Name="A"> 
    <SubNode1> 
     <SubNode2> 
     </SubNode2> 
    </SubNode1> 
</Function> 
<Function Name="B"> 
    <SubNode1> 
     <SubNode2> 
     </SubNode2> 
    </SubNode1> 
</Function> 
<Function Name="A"> 
    <SubNode1> 
     <SubNode2> 
     </SubNode2> 
    </SubNode1> 
</Function> 

Теперь я хочу, чтобы отобразить все функции с помощью XQuery, используя этот код.

for $currentFunction in $node where local-name($currentFunction) = 'Function'      
return 
(
    <Function> 
    { 
     local:printAttributes($currentFunction) 
    } 
    </Function> 
) 

Это прекрасно работает. Но я хочу отображать только функции с разными атрибутами Name. Он должен показывать только функцию с именем A и именем с именем B, последняя функция с именем A не должна включаться.

Как я могу это сделать? Какие-либо предложения? Я использую XQuery 1.0

ответ

1

Вы можете использовать group by найти функции с тем же именем:

for $func in /Content/Function 
let $name := $func/@Name 
group by $name 
let $last-func := ($func/.)[last()] 
return <Function Name="{$name}">{ 
    local:printAttributes($last-func) 
}</Function> 

Поскольку порядок внутри групп не нормируется, вам нужно использовать шаг самостоятельной /. в $last-func к сортировать элементы в заказ документа.

В XQuery 1.0 можно моделировать с помощью group byfn:distinct-values(...):

for $name in distinct-values(/Content/Function/@Name) 
let $funcs := /Content/Function[@Name = $name] 
let $last-func := $funcs[last()] 
return <Function Name="{$name}">{ 
    local:printAttributes($last-func) 
}</Function> 
+0

К сожалению, забыл сказать, я использую XQuery 1.0 группа не кажется, чтобы работать там? – Sharivari

+0

Я добавил решение без 'group by'. –

+0

Работал! Большое спасибо. – Sharivari