Генерируйте непечатаемые символы младшего порядка из XLST
-
12-09-2019 - |
Вопрос
Я пытаюсь использовать текстовый вывод 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="/"></xsl:template>
</xsl:stylesheet>
Я получаю следующую ошибку:
[Fatal Error] :4:35: Character reference "" is an invalid XML character.
ERROR: 'Character reference "" is an invalid XML character.'
FATAL ERROR: 'Could not compile stylesheet'
Я пробовал использовать и реальный символ 1, с разделом CDATA или без него, элементы xsl: text, карты символов xslt-2, пару разных кодировок, но я не могу понять, как получить символ ascii с двоичным кодом = 1.
Мне пришлось прибегнуть к постобработке моих выходных данных, что не идеально.
Есть ли какой-нибудь способ сгенерировать из XSLT вывод одного непечатаемого символа низкого порядка?
Окружающая среда:Java 6, встроенная в XSL Transformer.
Решение
Вы можете вызывать статические методы классов 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>
Другие советы
Другой вариант, который я придумал, - это использовать xsl:param, которому вызывающая среда присваивает значение символа 0x01.
Это означает, что вместо того, чтобы всегда работать в среде Java и требовать изменений где-либо еще, таблица стилей требует поддержки среды во всех средах, но может работать без изменений во всех них.
Я пока не уверен, какая сторона этого компромисса предпочтительнее для того, над чем я работаю.