如何在XSLT 2.0中将HTML特殊转义字符转换为实际字符?
XSLT 2.0 批量转换HTML特殊转义字符为实际字符
问题场景
输入文本包含多层或大量HTML特殊转义字符(如ü、À),需要转换为对应实际Unicode字符,示例如下:
输入:
<Data>Lenevo100 f&amp;uuml;r Laser</Data> <Data>DELL &Agrave;llow Drucker</Data>
预期输出:
<DataOutput>Lenevo100 fÜr Laser</DataOutput> <DataOutput>DELL Àllow Drucker</DataOutput>
可行解决方案
方法1:预定义实体映射 + xsl:analyze-string正则替换
先定义包含目标HTML实体与对应字符的映射表,再通过正则匹配所有&[a-zA-Z0-9]+;格式的转义串,逐一替换:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 定义HTML实体映射,可按需扩展 --> <xsl:variable name="html-entities" as="element()*"> <entity name="amp" char="&"/> <entity name="uuml" char="Ü"/> <entity name="Agrave" char="À"/> </xsl:variable> <xsl:template match="Data"> <DataOutput> <xsl:analyze-string select="." regex="&([a-zA-Z0-9]+);"> <xsl:matching-substring> <xsl:value-of select="$html-entities[@name=regex-group(1)]/@char"/> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </DataOutput> </xsl:template> </xsl:stylesheet>
这种方法可控性强,适合需要自定义处理范围的场景,但需手动维护实体映射表。
方法2:利用XML解析自动处理转义
将待处理文本包装成合法XML片段,借助XML解析器自动解析实体转义:
- 把文本拼接成完整XML元素字符串
- 用
parse-xml()函数解析该字符串 - 提取解析后的文本内容
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="Data"> <DataOutput> <xsl:variable name="xml-fragment" as="xs:string" select="concat('<temp>', ., '</temp>')"/> <xsl:value-of select="parse-xml($xml-fragment)/temp/text()"/> </DataOutput> </xsl:template> </xsl:stylesheet>
这种方法无需手动维护实体,XML解析器会自动处理所有标准HTML实体(包括嵌套转义),是最省心的方案,前提是待处理文本不包含破坏XML结构的字符(如未转义的</>)。
方法3:使用扩展函数(依赖处理器支持)
如果使用支持扩展的XSLT处理器(如Saxon),可直接调用第三方库的HTML转义处理函数,比如Java的org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:escape="java:org.apache.commons.lang3.StringEscapeUtils"> <xsl:template match="Data"> <DataOutput> <xsl:value-of select="escape:unescapeHtml4(.)"/> </DataOutput> </xsl:template> </xsl:stylesheet>
这种方法覆盖所有HTML实体,无需手动配置,但需确保处理器支持扩展并引入对应依赖库。
内容的提问来源于stack exchange,提问作者HKmar
相关产品推荐
相关产品推荐

