2009-02-10 4 views
2

Я работаю над преобразованием XSLT для реорганизации блоков XML для проверки файлов NewsML. Некоторые из этих файлов содержат закодированные символы (например, & amp; & quot и т. Д.). Проблема в том, что преобразование XSLT преобразует эти символы в их буквальную строку (т.е. «и», «»). Это вызывает проблемы. Я не хочу, чтобы это произошло.Автоматическое преобразование экранированных символов в строковые литералы

Я экспериментировал с различными методами (использование < XSL: текст >, < XSL: стоимость из > и отключения-выхода-отводящего флага, < XSL: метод вывода = 'XML | HTML | XHTML | текст' >) безрезультатно. Эти методы либо преобразуют символы, либо просто оставляют их.

например, строка, которая начинается с "звезды на PM & Amp; APOS; s карт" может в конечном итоге, как

  • звезд на картах РМ
  • звезды на ФЭУ картах

Я использую приложение обработки Saxonica (http://www.saxonica.com/).

Базовый XSLT, который я использую, приведен ниже. (Есть и другие вещи, но проблема существует даже с этой простой таблицы стилей)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="no" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Любые идеи о том, как предотвратить это преобразование будет наиболее ценится. Требование состоит в том, чтобы сохранить исходный текст по мере его появления.

ответ

1

Я думаю, вам нужно сделать как disable-output-escaping = "yes", так и установить документ в HTML одновременно.

ОТ W3C (курсив мой):

Это ошибка для выхода отводящей быть отключены для текстового узла, который используется для чего-то другого, чем текстовый узел в результирующем дереве. Таким образом, является ошибкой отключить выходное экранирование для текстового элемента xsl: value-of или xsl:, который используется для генерации строкового значения комментария, инструкции обработки или узла атрибута; это также ошибка для преобразования фрагмента дерева результатов в число или строку, если фрагмент результирующего дерева содержит текстовый узел, для которого исключение отключено. В обоих случаях процессор XSLT может сигнализировать об ошибке; , если он не сигнализирует об ошибке, он должен восстановиться, игнорируя атрибут disable-output-escaping.

Атрибут disable-output-escaping может использоваться с методом вывода html, а также с методом вывода xml. Метод вывода текста игнорирует атрибут disable-output-escaping, так как он не выполняет выходное экранирование.

Процессор XSLT сможет отключать выходное экранирование только в том случае, если он управляет выходом выходного дерева. Это может быть не всегда так. Например, дерево результатов может использоваться как исходное дерево для другого преобразования XSLT вместо вывода. Процессор XSLT не требуется для поддержки отключения экранирования вывода. Если текст xsl: value-of или xsl: указывает, что выходное экранирование должно быть отключено, а XSLT-процессор не поддерживает это, процессор XSLT может сигнализировать об ошибке; если он не сигнализирует об ошибке, он должен восстановиться, не отключая выходное экранирование.

Если выходное экранирование отключено для символа, который не представлен в кодировке, которую использует XSLT-процессор для вывода, то процессор XSLT может сигнализировать об ошибке; если он не сигнализирует об ошибке, он должен восстановиться, не отключая выходное экранирование.

С Отключение выхода escaping может не работать со всеми XSLT-процессорами и может привести к тому, что XML не является корректным, его следует использовать только тогда, когда альтернативы нет.

+0

Использование Xalan версии 2.7.1 и Я получаю странные результаты: " -> " & -> & ' -> ' < -> < > -> > Как вы можете видеть - только некоторые из субъектов были убежали. – NSPKUWCExi2pr8wVoGNk

1

Это entities. Обычно they get mapped - представление юникода этого объекта. Окончательный поток будет содержать только символы. Если вы выведете поток, это зависит от сериализатора, чтобы избежать символов в зависимости от типа вывода (это то, что вы можете отключить при отключении-выходе-экранировании). Таким образом, собственно сериализатору должен превратить этот

<xsl:output method="html" encoding="UTF-8"/> 
<xsl:text>some&#160;test</xsl:text> 

в

some&nbsp;test 

См раздел 5 на this article.

Так что я бы это проверить с помощью вашего XSLT-процессора.

 Смежные вопросы

  • Нет связанных вопросов^_^