Функция xquery для преобразования элементов тега в атрибуты - PullRequest
0 голосов
/ 18 мая 2010

Мне нужно написать функцию, которая принимает последовательность элементов «тега» в форме:

<tag type="markupType" value="topic"/> 
<tag type="concept" value="death"/>
...

и превращает их в атрибуты вида

data-markupType="topic"
data-concept="death"

Пока у меня есть следующая функция:

declare function local:tagsToAttrs($tags as element()*) as attribute()*
{
    for $tag in $tags
    let $type := $tag/string(@type)
    let $value := $tag/string(@value)
    return
        attribute { concat('data-', $type) } { $value }
};

Пока все работает нормально, но мне нужно разобраться со случаем, когда у меня есть два или более тега с одинаковым «типом». В этом случае у меня не может быть двух атрибутов с одинаковым именем, поэтому я хочу иметь один атрибут со значениями, разделенными пробелами ...

1012 *, например *

<tag type="concept" value="death"/>
<tag type="concept" value="life"/>
<tag type="concept" value="birth"/>

станет

data-concept="death life birth"

Я застрял на этом некоторое время - поэтому, если у кого-нибудь есть хороший способ изменить мою функцию, я буду очень признателен.

Пожалуйста, обратите внимание, я не хочу использовать XSLT для этого. Я хочу использовать XQuery.

С уважением

1024 * Свами *

1 Ответ

0 голосов
/ 19 мая 2010

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

declare function local:tagsToAttrs($tags as element()*) as attribute()*
{
    for $type in distinct-values($tags/@type)
    let $value := string-join($tags[@type=$type]/@value," ")
    return
        attribute { concat('data-', $type) } { $value }
};
...