2010-05-18 5 views
0

je dois écrire une fonction qui prend une séquence d'éléments « tag » de la forme:fonction XQuery pour convertir des éléments de balises aux attributs

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

et les transforme en attributs de la forme

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

jusqu'à présent, j'ont la fonction suivante:

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

Cela fonctionne très bien jusqu'à présent, mais je dois traiter wi le cas où j'ai deux ou plusieurs étiquettes avec le même "type". Dans ce cas, je ne peux pas avoir deux attributs avec le même nom, donc je veux avoir un seul attribut avec des valeurs séparées par des espaces ...

par exemple.

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

deviendrait

data-concept="death life birth" 

Je suis coincé là-dessus depuis un certain temps maintenant - donc si quelqu'un a une belle façon de modifier ma fonction pour ce faire, je serais bien obligé.

Pls note Je ne veux pas utiliser XSLT pour cela. Je veux utiliser XQuery.

Cordialement

Swami

Répondre

0

Pour chaque type distinct, obtenir la valeur d'attribut en joignant les valeurs des variables avec ce type:

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