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逻辑存在两处混乱:
- 针对
Feature[@code='c']的模板里,先输出了带冗余属性的<p code="cc" price="33">C</p>,又调用apply-templates select="@*",触发@price模板额外输出<p>3</p> - 默认的身份模板(
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
相关产品推荐
相关产品推荐

