如何在Saxon XSLT的<xsl:message>中向Windows控制台发送颜色命令?
在Windows CMD/Bat中为XSLT3.0的
<xsl:message>输出添加控制台颜色的解决方案 问题描述
在Windows系统通过CMD/Bat运行XSLT3.0样式表时,尝试为<xsl:message>的输出添加上下文颜色。修改注册表将CMD转为终端后,虽然可以用[36mThis is blue[0m这类代码给echo输出上色,但把该代码用到<xsl:message>中时触发XML解析错误:
SXXP0003: Error reported by XML parser: An invalid XML character (Unicode: 0x1b) was found in the element content of the document. org.xml.sax.SAXParseException; systemId: file:/C:/Temp/idr_migration/10year_Archive_Migration/xslt3_xml_to_josn.xsl; lineNumber: 49; columnNumber: 23; An invalid XML character (Unicode: 0x1b) was found in the element content of the document
可行解决方案
1. 用XML字符引用替代ESC控制字符
XML不允许直接包含ASCII控制字符(0x1b即ESC键对应的Unicode值),可以通过字符实体引用来表示该字符,让XML解析器正确识别:
- 十进制引用:
 - 十六进制引用:

修改后的<xsl:message>示例:
<xsl:message terminate="no">[36mThis is blue[0m</xsl:message>
控制台会正常解析这个ESC序列,输出蓝色文本后重置颜色。
2. 定义XSLT变量复用颜色代码
为了避免重复编写字符引用,可以把控制字符和颜色码封装成变量,提升代码可读性:
<xsl:variable name="esc" select="''"/> <xsl:variable name="color-blue" select="concat($esc, '[36m')"/> <xsl:variable name="color-reset" select="concat($esc, '[0m')"/> <xsl:message terminate="no"> <xsl:value-of select="concat($color-blue, 'This is blue', $color-reset)"/> </xsl:message>
3. 其他替代方案
如果上述方法存在兼容性问题,还可以尝试:
- 借助外部工具处理输出:将XSLT的输出重定向到支持ANSI颜色的工具(如
ansicon),不过需要额外安装工具。 - 利用XSLT处理器扩展:部分处理器(如Saxon)支持扩展函数直接输出带颜色的文本,可查阅对应处理器的官方文档实现。
内容的提问来源于stack exchange,提问作者Binsky
相关产品推荐
相关产品推荐

