代码之家  ›  专栏  ›  技术社区  ›  Stephen Denne

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

  •  1
  • Stephen Denne  · 技术社区  · 15 年前

    我试图使用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:text元素,xsl t-2字符映射,一些不同的编码,但是我不知道如何获得二进制代码为1的ASCII字符。

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

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

    环境:Java 6,内置XSL转换器。

    2 回复  |  直到 15 年前
        1
  •  3
  •   ftl    15 年前

    可以从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>
    
        2
  •  0
  •   Stephen Denne    15 年前

    我想到的另一个选项是使用xsl:param,调用环境将其设置为字符0x01。

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

    我还不确定这种权衡的哪一方面比我正在做的更好。