XSL转换过程中如何对sect实体进行反转义?
解决XSLT处理
§实体时的解析错误 问题根源
XML解析器仅默认支持&、<、>、"、'这五个预定义实体,§不在此范围内。你的输入XML直接使用了§但未提前声明该实体,因此触发了SXXP0003解析错误。
可行解决方案
方案1:给输入XML添加实体声明
在输入XML的根元素前添加DOCTYPE声明,明确定义sect实体:
<!DOCTYPE 你的根元素名 [ <!ENTITY sect "§"> ]>
示例(假设根元素为doc):
<!DOCTYPE doc [ <!ENTITY sect "§"> ]> <doc> <!-- 你的XML内容 --> </doc>
添加后XML解析器就能识别§实体,XSLT的字符映射可正常工作。
方案2:修改XSLT字符映射,直接使用Unicode值
将XSLT字符映射中的§替换为对应的Unicode十六进制值§,修改后的字符映射代码如下:
<xsl:character-map name="mdash"> <xsl:output-character character="—" string="&mdash;"/> <xsl:output-character character="&" string="&amp;" /> <xsl:output-character character=""" string="&quot;" /> <xsl:output-character character="&apos;" string="&amp;apos;" /> <xsl:output-character character="§" string="&sect;" /> </xsl:character-map>
修改后XSLT会直接匹配§字符(对应§),输出为&sect;,最终生成的XML里会保留§实体,同时避免解析错误。
方案3:将输入当作纯文本处理(适用于特殊场景)
若无法修改输入XML且不想添加实体声明,可使用XSLT的unparsed-text()函数读取输入文件为纯文本,再用replace()函数替换目标字符:
<xsl:template match="/"> <xsl:variable name="text" select="unparsed-text('你的输入文件路径.xml')"/> <xsl:variable name="processed-text" select="replace($text, '§', '&sect;')"/> <!-- 可添加其他实体的替换逻辑,比如处理&、"等 --> <xsl:value-of select="$processed-text" disable-output-escaping="yes"/> </xsl:template>
此方法适合输入格式不严格的场景,但需手动处理所有需要保留的实体,复杂度较高。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

