XQuery - динамически меняются значения атрибута и элемента (обратная структура) - PullRequest
0 голосов
/ 06 мая 2018

Итак, у меня есть это (необычное) задание

"Написать запрос, который инвертирует все подэлементы элемента / music так что их собственные подэлементы становятся атрибутами и их атрибутами стать субэлементами. Для тех подэлементов, которые не имеют подэлементов их собственные, их содержание данных должно стать атрибутом с именем 'Значение'. "

где я использую эту базу данных: https://gist.githubusercontent.com/Schytheron/0a5c4756db62a1f43fc40226659c12cf/raw/71378ab9cede19e3f5bb33e948177a9fccfcc132/songs.xml и я действительно даже не знаю, с чего начать. Я полностью потерян. Это можно решить только рекурсивно или есть другой способ (потому что я никогда не пытался делать рекурсию в Xquery)? Есть ли у вас какие-либо советы / стратегии для решения этой или каких-либо полезных функций (я очень плохо знаком с Xquery, поэтому не знаю, сколько полезных функций) я могу использовать?

Мысли? Идеи?

Спасибо!

РЕДАКТИРОВАТЬ: Просто чтобы прояснить ситуацию. Я знаю, что, вероятно, я могу просто сделать это вручную для каждого элемента и его дочерних элементов с количеством вложенных циклов for x, но я хочу знать, есть ли способ сделать это динамическим, чтобы он работал с ЛЮБОЙ базой данных XML.

1 Ответ

0 голосов
/ 06 мая 2018

Для ограниченного случая использования преобразования дочернего элемента корневого элемента вы можете использовать некоторые функции:

declare function local:transform($element as element()) as element() {
  element {name($element)} { 
    $element/node() ! local:attribute(.), 
    $element/@* ! local:element(.) 
  }
};

declare function local:attribute($node as node()) as attribute() {
  typeswitch ($node) 
     case element() return attribute {name($node)} {data($node) }
     case text() return attribute value { $node }
     default return ()

};

declare function local:element($att as attribute()) as element() {
  element {name($att)} { data($att) }
};

/*!element {name()} { *!local:transform(.) }

https://xqueryfiddle.liberty -development.net / nbUY4ki

...