Автоматическое преобразование экранированных символов в строковые литералы - PullRequest
2 голосов
/ 11 февраля 2009

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

Я экспериментировал с различными методами (использование , и флага отключения-вывода-выхода, ) но безрезультатно. Эти методы либо преобразуют символы, либо просто пропускают их.

например, строка, которая начинается со «звездочек на картах ПМ» и может заканчиваться как

  • звездочек на карточках ПМ
  • звездочек на картах PMs

Я использую 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>

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

Ответы [ 2 ]

1 голос
/ 11 февраля 2009

Это сущности . Обычно они сопоставляются с юникодным представлением этой сущности. Последний поток будет содержать только символы. Если вы выводите поток, это зависит от сериализатора, чтобы экранировать символы в зависимости от типа вывода (что можно отключить с помощью disable-output-escaping) Таким образом, правильный сериализатор должен повернуть это

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

в

some&nbsp;test

См. Раздел 5 по этой статье .

Так что я бы сначала проверил это с вашим процессором XSLT.

1 голос
/ 11 февраля 2009

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

ОТ W3C (акцент мой):

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

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

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

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

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

...