You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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解析器正确识别:

  • 十进制引用:&#27;
  • 十六进制引用:&#x1b;

修改后的<xsl:message>示例:

<xsl:message terminate="no">&#x1b;[36mThis is blue&#x1b;[0m</xsl:message>

控制台会正常解析这个ESC序列,输出蓝色文本后重置颜色。

2. 定义XSLT变量复用颜色代码

为了避免重复编写字符引用,可以把控制字符和颜色码封装成变量,提升代码可读性:

<xsl:variable name="esc" select="'&#x1b;'"/>
<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:26:06