如何更改值并创建新元素?

时间:2014-10-09 19:24:35

标签: xml xquery

我是XQuery的新手。有没有办法使用XQuery来转换此输入

<mods>
    <subject>
        <topic> bird ; cat ; dog ; lion </topic>
    </subject>
</mods>

进入以下XML?

<mods>
    <subject>
        <topic> bird </topic><topic> cat </topic><topic> dog </topic><topic> lion </topic>
    </subject>
</mods>

我尝试使用该功能

replace(node,';','</topic><topic>' )

但它将角度< >括号转换为实体引用&lt;&gt;

2 个答案:

答案 0 :(得分:2)

replace(...)仅适用于字符串,不适用于元素。 '</topic><topic>'(字符串)和</topic><topic>(无效的XML)不一样!

重建结果(您可能也可以使用XQuery Update),并对每个<topic/>元素进行标记,为每个元素创建新的主题项:

element mods {
  element subject {
    for $topics in /mods/subject/topic
    for $topic in tokenize($topics, ';')
    return element topic { $topic }
  }
}

为了构造新元素,我更喜欢上面使用的计算元素构造函数。 element nodeName { $content }相当于使用<nodeName>{ $content }</nodeName>

答案 1 :(得分:2)

如果您的XQuery Processor支持XQuery Update,您可以尝试以下查询:

copy $xml := document {
  <mods>
    <subject>
        <topic> bird ; cat ; dog ; lion </topic>
    </subject>
  </mods>
}
modify (
  let $topic := $xml/mods/subject/topic
  return replace node $topic with
    for $token in tokenize($topic, ';')
    return <topic>{ $token }</topic>
)
return $xml