XQuery动态交换属性与元素值(反转结构)技术实现咨询
实现XML结构反转的XQuery查询
没问题,我来帮你完成这个XML结构反转的任务。先明确下咱们要实现的转换规则,对应你的需求:
- 针对
/music下的每一个直接子元素:- 把元素原有的属性转换为同名的子元素(属性值作为子元素的文本内容)
- 把元素原有的子元素转换为同名的属性(子元素的文本内容作为属性值)
- 如果该子元素本身没有任何子元素(是叶子节点),就把它的文本内容转换成名为
value的属性
完整XQuery代码
<music> { // 遍历/music下的所有直接子元素 for $parent in doc("songs.xml")/music/* return // 创建与原元素同名的新元素 element { node-name($parent) } { // 规则1:将原元素的属性转为子元素 for $attr in $parent/@* return element { node-name($attr) } { data($attr) }, // 规则2&3:处理原元素的子元素或文本内容 if ($parent/*) then // 有子元素时,将子元素转为属性 for $child in $parent/* return attribute { node-name($child) } { data($child) } else if (normalize-space($parent/text())) then // 无子元素但有文本时,转为value属性 attribute value { normalize-space($parent/text()) } else // 既无子元素也无文本时,不添加任何内容 () } } </music>
代码说明
- 根节点保留:外层始终输出
<music>根元素,保证结构完整性 - 属性转子元素:通过循环遍历原元素的所有属性,为每个属性创建同名子元素,并用
data()提取属性值作为子元素文本 - 子元素转属性:如果原元素有子元素,遍历每个子元素,创建同名属性,提取子元素文本作为属性值
- 叶子节点处理:用
normalize-space()过滤掉空文本,确保只有有效文本内容才会生成value属性
转换示例
比如原XML中的一个元素:
The Beatles The Beatles
转换后会变成:
Hey Jude 1968
再比如叶子节点:
Rock
转换后:
内容的提问来源于stack exchange,提问作者Schytheron
相关产品推荐
相关产品推荐

