2010-05-18 48 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" 

我一直停留在這個有一段時間了 - 所以,如果任何人有修改我的函數來做到這一點,我會非常感激的一個很好的方式。

請注意我不想爲此使用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 } 
};