Генерировать младшие непечатаемые символы из XLST

Я пытаюсь использовать текстовый вывод 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, картами символов xslt-2, парой разных кодировок, но я не могу понять, как получить символ ascii с двоичным кодом код = 1.

Мне пришлось прибегнуть к постобработке моего вывода, что не идеально.

Есть ли способ создать один непечатаемый символ младшего порядка из XSLT?

Среда: Java 6, встроенный в XSL Transformer.


person Stephen Denne    schedule 09.07.2009    source источник


Ответы (2)


Вы можете вызывать статические методы классов Java из XSLT. Используйте следующий хак, например, чтобы записать 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>
person ftl    schedule 09.07.2009
comment
Спасибо - это работает для моей среды. Нет ли чистого XSLT-решения? - person Stephen Denne; 10.07.2009
comment
Я думаю, что первоначальное намерение XSLT состояло в том, чтобы производить читаемый вывод, а не двоичные данные. Двоичные форматы документов являются областью XSL-FO. Для реальных двоичных форматов XSL не является предпочтительным инструментом. - person ftl; 10.07.2009
comment
Мой вывод в основном читаемый текст. Я адаптирую существующие таблицы стилей xslt, изначально предназначенные для создания html. С очень небольшим изменением они работают почти так, как мне нужно. - person Stephen Denne; 10.07.2009

Другой вариант, который я придумал, — использовать xsl:param, который вызывающая среда устанавливает в символ 0x01.

Это означает, что вместо того, чтобы всегда работать в среде Java и требовать изменений где-либо еще, таблица стилей требует поддержки среды во всех средах, но может работать без изменений во всех них.

Я еще не уверен, какая сторона этого компромисса предпочтительнее для того, над чем я работаю.

person Stephen Denne    schedule 12.07.2009