views:

375

answers:

2

I'm trying to use XSLT text output to generate a file (in a file format that I'm not in control of), and while it is mostly text, it includes low-order non-printable characters as flags, including characters that are not valid within an XLST file (according to the XSLT specification).

I'd like for something like the below to work, but instead it isn't a valid XSLT file since it it contains characters that are not allowed in XSLT files:

<?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>

I get the following error:

[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'

I've tried with an actual character 1 too, with or without a CDATA section, xsl:text elements, xslt-2 character maps, a couple of different encodings, but I can't figure out how to get a ascii character with binary code = 1.

I've had to resort to post-processing my output, which isn't ideal.

Is there any way to generate a single low-order non-printable character output from XSLT?

Environment: Java 6, built in XSL Transformer.

+3  A: 

You can call static methods of Java classes from XSLT. Use the following hack for example to write 0x01 to your output stream:

<?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>
ftl
Thank you - that works for my environment. Is there no pure XSLT solution?
Stephen Denne
I think the original intension of XSLT is to produce "readable" output, not binary data. Binary document formats are the domain of XSL-FO. For "real" binary formats, XSL is not the tool of choice.
ftl
My output is mostly readable text. I'm adapting existing xslt stylesheets originally designed to produce html. With a very small change they're working almost exactly as I need.
Stephen Denne
A: 

Another option that I've come up with, is to use an xsl:param which the calling environment sets to character 0x01.

This means that instead of always working within a java environment, and requiring changes anywhere else, that the stylesheet requires environmental support in all environments, but can work unchanged in them all.

I'm not yet sure which side of that trade-off is preferable for what I'm working on.

Stephen Denne