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
相关产品推荐
相关产品推荐

