XSLT无法识别
回车字符 替换特殊字符时报样式表编译错误
XSLT替换

相关编译/匹配错误的修正方案 错误根源
问题本质是混淆了XSLT文档本身的XML实体解析规则和XPath表达式的字符串值:写在XSLT文件内的所有XML实体,都会在样式表被解析加载的阶段提前转换为对应字符,不会作为字面文本传递给后续的XPath逻辑。
你之前尝试的几种写法的失效原因:
- 写
select="'
'":该值会被XML解析器直接转为真实的回车控制字符(ASCII 13),如果需求是匹配字面打印的
文本串,这种写法完全匹配不到目标内容 - 写
select="'
'":缺少XML实体必须的分号,属于非法的XML语法结构,直接触发样式表编译错误 - 写
select="'&#xD'":虽然&的转义逻辑正确,但漏掉了实体末尾的分号,最终生成的匹配字符串是
,和实际目标文本
存在字符差,无法匹配生效
分场景的正确写法
根据实际要匹配的目标内容,二选一使用对应配置:
- 场景1:替换节点值中真实存在的回车控制字符(也就是XML规范中

实体对应的ASCII 13控制符,通常是源文件中换行、回车格式不规范产生的隐藏字符)
修正后的代码片段:
这种写法下,XML解析器会自动将<xsl:variable name="value1"> <xsl:call-template name="replaceCharacters"> <xsl:with-param name="stringIn" select="$value"/> <xsl:with-param name="charsIn" select="'
'"/> <xsl:with-param name="charsOut" select="''"/> </xsl:call-template> </xsl:variable>
转换为对应回车字符,传入替换模板的参数就是匹配回车的目标值。 - 场景2:替换源XML中以字面文本形式存在的

字符串(也就是源文件中直接写了"&"、"#"、"x"、"D"、";"拼接的可见文本,没有被XML解析为真实回车的内容)
修正后的代码片段:
这种写法通过<xsl:variable name="value1"> <xsl:call-template name="replaceCharacters"> <xsl:with-param name="stringIn" select="$value"/> <xsl:with-param name="charsIn" select="'&#xD;'"/> <xsl:with-param name="charsOut" select="''"/> </xsl:call-template> </xsl:variable>&转义开头的&符号,确保XPath最终拿到的匹配字符串就是完整的字面文本
,同时补上了之前漏掉的末尾分号,不会触发XML语法编译错误。
注意事项
XSLT的实体解析发生在样式表加载的最前端,如果需要匹配的是某个特殊转义序列的字面文本,必须对序列中的&符号做&双重转义,同时补齐实体本身的语法结构(带末尾分号),否则要么触发编译错误,要么匹配到错误的字符。
内容的提问来源于stack exchange,提问作者SandunAmarathunga
相关产品推荐
相关产品推荐

