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

XSL转换XML为HTML时节点重复与属性冗余问题求助

解决XSL转换XML到HTML的节点替换问题

问题概况

要通过XSL把XML转成HTML,同时替换特定节点的内容,但现在遇到两个问题:

  • (a) 被替换的节点带着多余属性被完整渲染出来
  • (b) 原始节点的内容也被重复输出

当前输出结果

<p>1</p>
<p>2</p>
<p code="cc" price="33">C</p>
<p>3</p>

期望输出结果

<p>1</p>
<p>2</p>
<p>33</p>

XML源文件

<?xml version="1.0" encoding="UTF-8"?>
<Features>
  <Feature code="a" price = "1"></Feature>
  <Feature code="b" price = "2"></Feature>
  <Feature code="c" price = "3"></Feature>
</Features>

原有XSL的问题

原来的XSL逻辑存在两处混乱:

  1. 针对Feature[@code='c']的模板里,先输出了带冗余属性的<p code="cc" price="33">C</p>,又调用apply-templates select="@*",触发@price模板额外输出<p>3</p>
  2. 默认的身份模板(match="@* | node()")会复制不必要的节点结构,加上模板优先级处理不当,导致重复输出问题

修正后的XSL代码

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

  <!-- 根节点:遍历所有Feature节点 -->
  <xsl:template match="/">
    <xsl:apply-templates select="//Feature"/>
  </xsl:template>

  <!-- 通用Feature处理:输出对应price属性值的p标签 -->
  <xsl:template match="Feature">
    <p><xsl:value-of select="@price"/></p>
  </xsl:template>

  <!-- 特定code='c'的Feature:覆盖通用逻辑,直接输出目标内容 -->
  <xsl:template match="Feature[@code='c']">
    <p>33</p>
  </xsl:template>

</xsl:stylesheet>

修正说明

  • 删掉了默认的身份模板,避免复制原始XML的冗余节点结构
  • 通用Feature模板直接读取price属性值生成<p>标签,逻辑简洁直接
  • 针对code='c'的Feature模板优先级更高,直接输出目标内容,不会触发通用模板和多余的属性处理逻辑,彻底解决重复输出和多余属性的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:23:13