You need to enable JavaScript to run this app. XSL转换如何实现子节点属性平铺至父级 消除嵌套冗余结构
优惠活动
大模型
产品
解决方案
定价
更多

XSL转换如何实现子节点属性平铺至父级 消除嵌套冗余结构

原脚本问题根源
  • 模板绑定逻辑错误:将player节点与ranking节点绑定了一致的row生成规则,当处理ranking节点内部子节点时,遇到player就会触发新的row生成流程,最终形成嵌套结构。
  • 属性递归遍历逻辑错误:原脚本在row内部顺着XML层级递归处理所有子节点,没有跨层级直接抓取player节点的属性,导致属性提取流程被嵌套的row逻辑截断。
修正后的可用XSL脚本
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- 匹配根节点,生成外层data容器 -->
  <xsl:template match="rankings">
    <data>
      <xsl:apply-templates select="ranking"/>
    </data>
  </xsl:template>

  <!-- 仅针对ranking节点生成单个平铺row -->
  <xsl:template match="ranking">
    <row>
      <!-- 一次性提取ranking自身属性 + 内部player节点的全部属性 -->
      <xsl:apply-templates select="@* | player/@*"/>
    </row>
  </xsl:template>

  <!-- 通用属性转元素逻辑 -->
  <xsl:template match="@*">
    <xsl:element name="{name()}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

  <!-- 拦截player节点本体的处理,避免触发冗余逻辑 -->
  <xsl:template match="player"/>
</xsl:stylesheet>
改动说明
  • 拆分原脚本中player与ranking共用的row生成模板,从规则层面杜绝嵌套row的触发可能
  • 调整row内部的属性抓取范围:不再顺着XML子节点层级递归遍历,直接一次性拉取ranking节点本身的属性、以及其下player节点的所有属性,所有属性生成的子元素全部平级落在同一个row内部
  • 增加空匹配规则拦截player节点本体的模板触发,仅保留它携带的属性值的提取流程
  • 合并原脚本中两段重复的属性转换逻辑,精简代码量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 16:45:03