You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XQuery动态交换属性与元素值(反转结构)技术实现咨询

实现XML结构反转的XQuery查询

没问题,我来帮你完成这个XML结构反转的任务。先明确下咱们要实现的转换规则,对应你的需求:

  • 针对/music下的每一个直接子元素:
    1. 把元素原有的属性转换为同名的子元素(属性值作为子元素的文本内容)
    2. 把元素原有的子元素转换为同名的属性(子元素的文本内容作为属性值)
    3. 如果该子元素本身没有任何子元素(是叶子节点),就把它的文本内容转换成名为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>

代码说明

  1. 根节点保留:外层始终输出<music>根元素,保证结构完整性
  2. 属性转子元素:通过循环遍历原元素的所有属性,为每个属性创建同名子元素,并用data()提取属性值作为子元素文本
  3. 子元素转属性:如果原元素有子元素,遍历每个子元素,创建同名属性,提取子元素文本作为属性值
  4. 叶子节点处理:用normalize-space()过滤掉空文本,确保只有有效文本内容才会生成value属性

转换示例

比如原XML中的一个元素:

The Beatles The Beatles

转换后会变成:

Hey Jude 1968

再比如叶子节点:

Rock

转换后:

内容的提问来源于stack exchange,提问作者Schytheron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:38:19