XQuery: создать новый элемент с заданным именем?

У меня есть данные вроде:

    <td>USERID</td>

    <td>NAME</td>

    <td>RATING</td>

Я хочу преобразовать его в:

<userid></userid>
<name></name>
<rating></rating>

Как я могу это сделать?

Ответы

Ответ 1

Используйте конструктор вычисляемых элементов для создания элемента со значением lower-case узлов text для каждого из элементов td.

A конструктор вычисляемых элементовсоздает элемент node, что позволяет имя и содержимое nodeдля вычисления.

Для примера, предположив, что ваш XML находится в файле с именем foo.xml, вы можете сделать что-то вроде этого:

<doc>
{
for $name in doc('foo.xml')//td/text()
return element {lower-case($name)} {''}
}
</doc>

чтобы произвести это:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
 <userid/>
 <name/>
 <rating/>
</doc>

Вы также можете оценить функцию lower-case() как часть выражения XPATH вместо конструктора элемента, например:

<doc>
{
for $name in doc('foo.xml')//td/text()/lower-case(.)
return element {$name} {''}
}
</doc>

Ответ 2

return <doc>{
for $d in $doc/element()/text()
return element{fn:lower-case($d)} {}}</doc>  

где $doc хранит Xml.