使用XSLT进行XML转HTML异常:多余内容输出问题求助
问题排查:XSLT转换XML时意外输出多余内容
我尝试用XSLT将XML转换为HTML,仅需提取<metadata>标签下的<title>并生成<h1>标签,但实际输出额外包含了“Hi hello world”内容。刚接触XSLT仅一天,恳请帮忙排查问题。
XML代码
<document> <metadata> <title>Sign in to my account</title> </metadata> <topic> <conceptuldocument> <legacybold> Hi hello world </legacybold> </conceptuldocument> </topic> </document>
XSLT代码
<?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" > <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <xsl:choose> <xsl:when test="metadata"> <xsl:apply-templates select="metadata"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template match="metadata"> <h1> <xsl:value-of select="title"/> </h1> </xsl:template> </xsl:stylesheet>
C#代码
using (StringWriter sw = new StringWriter()) { transform.Transform(xmldocument.DocumentElement,null, sw); string html = sw.ToString(); }
问题原因及解决方法
问题源于XSLT的默认模板规则:当XSLT遇到没有匹配模板的节点时,会自动调用默认模板遍历所有子节点,并输出所有文本节点内容,这就是“Hi hello world”被意外输出的原因。
解决方法是添加一个空模板,匹配所有不需要处理的节点,阻止默认模板的行为:
修改后的XSLT代码:
<?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" > <xsl:output method="html" indent="yes"/> <!-- 匹配document根节点,仅处理metadata --> <xsl:template match="/document"> <xsl:apply-templates select="metadata"/> </xsl:template> <!-- 处理metadata生成h1标签 --> <xsl:template match="metadata"> <h1> <xsl:value-of select="title"/> </h1> </xsl:template> <!-- 空模板,拦截所有未自定义处理的节点,避免默认输出 --> <xsl:template match="*|text()|@*"/> </xsl:stylesheet>
同时可以简化原代码里的<xsl:choose>逻辑——如果<metadata>节点不存在,<xsl:apply-templates>不会执行任何操作,无需额外判断。
内容的提问来源于stack exchange,提问作者sumanth d
相关产品推荐
相关产品推荐

