xquery函数将标记元素转换为属性

时间:2010-05-18 12:28:44

标签: attributes xquery elements

我需要编写一个函数,它接受一系列形式的“tag”元素:

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

到目前为止这个工作正常,但我需要处理我有两个或多个具有相同“类型”的标签的情况。在这种情况下,我不能有两个具有相同名称的属性,所以我想要一个具有空格分隔值的属性...

e.g。

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

会变成

data-concept="death life birth"

我已经坚持了一段时间了 - 所以如果有人有一个很好的方法来修改我的功能来做到这一点,我会非常感激。

请注意我不想使用XSLT。我想使用XQuery。

亲切的问候

斯瓦米萨

1 个答案:

答案 0 :(得分: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 }
};