从XSLT生成低阶不可打印字符

时间:2009-07-09 10:19:13

标签: java xslt text binaryfiles

我正在尝试使用XSLT文本输出来生成文件(使用我无法控制的文件格式),虽然它主要是文本,但它包含低位不可打印字符作为标志,包括在XLST文件中无效的字符(根据XSLT规范)。

我希望像下面这样的东西能够工作,但它不是一个有效的XSLT文件,因为它包含XSLT文件中不允许的字符:

<?xml version="1.0" encoding="US-ASCII" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" encoding="US-ASCII"/>
  <xsl:template match="/">&#1;</xsl:template>
</xsl:stylesheet>

我收到以下错误:

[Fatal Error] :4:35: Character reference "&#1" is an invalid XML character.
ERROR:  'Character reference "&#1" is an invalid XML character.'
FATAL ERROR:  'Could not compile stylesheet'

我也试过了一个真正的角色1,有或没有CDATA部分,xsl:文本元素,xslt-2角色地图,几种不同的编码,但我无法弄清楚如何得到一个ascii二进制代码= 1的字符。

我不得不求助于对输出进行后期处理,这并不理想。

有没有办法从XSLT生成一个低阶非打印字符输出?

环境:Java 6,内置于XSL Transformer。

2 个答案:

答案 0 :(得分:3)

您可以从XSLT调用Java类的静态方法。例如,使用以下hack将0x01写入输出流:

<?xml version="1.0" encoding="US-ASCII" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:char="java.lang.Character" version="1.0">
    <xsl:output method="text" encoding="US-ASCII" />
    <xsl:template match="/">
        <xsl:value-of select="char:toString(1)"></xsl:value-of>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

我提出的另一个选择是使用调用环境设置为字符0x01的xsl:param。

这意味着,样式表在所有环境中都需要环境支持,而不是总是在Java环境中工作,并且需要在其他任何地方进行更改,但它们可以在所有环境中保持不变。

我还不确定这种权衡的哪一方更适合我正在做的工作。