2010-05-18 1 views
0

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

<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 } 
}; 

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

например.

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

станет

data-concept="death life birth" 

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

Заметка Pls Я не хочу использовать XSLT для этого. Я хочу использовать XQuery.

С наилучшими пожеланиями

Свами

ответ

0

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

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 } 
};