Unicode拉丁字符十六进制代码XSL转换问题:波浪号未转译
问题分析与解决方案
首先明确两个关键事实:
Ä对应Unicode字符U+00C4(Ä),属于可打印拉丁字符,XML解析器默认会自动解析这类实体;˜对应Unicode控制字符U+0098(不可见控制字符,并非波浪号)——波浪号(~)的正确十六进制引用是~,这大概率是你误用了字符引用。
以下分两种场景给出解决方案:
场景1:你实际需要的是波浪号(~)
直接修正XML中的字符引用,将˜替换为~(或十进制的~),XSLT会自动将其解析为波浪号字符,无需修改XSLT样式表。
场景2:你确实需要解析U+0098控制字符
如果你的需求是将˜解析为对应的控制字符,问题出在XML解析器默认对C1控制字符的处理规则上,可通过以下方式解决:
- 显式解析实体:在XSLT中使用
codepoints-to-string()函数手动转换。假设输入文本中包含未被解析的˜字符串,可通过以下代码处理:<!-- 提取十六进制码并转换为字符 --> <xsl:variable name="hex-code" select="replace(., '&#x([0-9A-Fa-f]+);', '$1')"/> <xsl:value-of select="codepoints-to-string(xs:integer($hex-code, 16))"/> - 检查解析器设置:确保你的XML解析器启用了C1控制字符的解析支持(部分解析器默认禁用这类控制字符的解析)。
额外排查项:XSLT输出序列化设置
若确认实体已被解析,但输出时又被转义,检查样式表中的<xsl:output>配置:
- 确保
encoding设置为UTF-8等支持全字符集的编码; - 避免在
<xsl:value-of>或<xsl:text>上错误设置disable-output-escaping="yes",这会导致已解析的字符被重新转义为实体。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

