2010-12-13 3 views
1

Я использую Saxon & XSLT для преобразования HTML-документов, над которыми я не контролирую.Разрешить недопустимые символы HTML в преобразовании XSLT

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

™

вместо кодированный

™ 

Как она стоит, Saxon бросает исключение при преобразовании из HTMLEmitter:

else if (c >= 127 && c < 160) { 
         // these control characters are illegal in HTML 
         DynamicError err = new DynamicError(
         "Illegal HTML character: decimal " + (int) c); 
         err.setErrorCode("SERE0014"); 
         throw err; 

Есть в любом случае, чтобы быть более мягким и сказать Саксону игнорировать и пропускать эти символы, как они есть - или - как мне настроить Saxon на использование XMLEmitter и а не HTMLEmitter?

+0

XML допускает произвольные символы, если кодировка правильная. Единственными исключениями являются обычные: '<> '" & 'которые должны быть выражены через ссылки на сущности. Также, что такое символ _HTML_? – musiKk

+0

@Dimitre: Это справедливый вопрос' xslt'. – 2010-12-13 20:57:39

+0

@Alejandro: Я бы согласитесь, правильно ли было задано название вопроса, и если он не попросил только саксонскую.В названии вопрос заключается в том, как работать с недопустимыми символами XML с саксофоном, а то, что действительно хочет OP, - это как выводить определенные специальные символы. –

ответ

4

Этот символ недопустим в HTML, потому что он не обязательно будет отображаться как ожидаемый, в зависимости от кодовой страницы пользователя. Вы хотите использовать правильную кодовую точку, &#x2122; и не забудьте использовать кодировку UTF-8.

EDIT: персонаж-карта

<xsl:character-map name="TM"> 
    <xsl:output-character character="&#153;" string="&#x2122;"/> 
</xsl:character-map> 
+0

Я знаю, что это недопустимый HTML, но ради аргумента, все равно проигнорировать его. Я абсолютно НЕ могу изменить исходный HTML. – Joel

+1

Можете ли вы использовать карту символов в XSLT для преобразования недопустимого символа в правильную кодировку? –

+0

+1 Хороший ответ. – 2010-12-13 16:48:07

2

Saxon - это XSLT-процессор, а не XML-парсер. Если вы получаете ошибки, анализирующие входные документы, то это - синтаксический анализатор XML (а не саксонский), и это означает, что ваш ввод не является корректным XML. На платформе Java, если входной код HTML, а не XML, вы можете избежать использования вместо TagSoup http://home.ccil.org/~cowan/XML/tagsoup/ вместо синтаксического анализа XML.

С другой стороны, я согласен с уже сделанным комментарием, XNL строит и поддерживает Unicode, поэтому ваш входной документ может использовать символы Unicode, если документы правильно закодированы и объявить использованную кодировку в декларации XML. С Unicode кодовая точка '™' равна 8482, а не 153. Я полагаю, что в ваших входных документах используется кодовая страница Windows, например, 1252, в этом случае ваши документы должны начинаться с <?xml version="1.0" encoding="Windows-1252"?>, чтобы знать анализатор XML.

+0

ОК, но, полагая, что я абсолютно не могу изменить исходный HTML-код, и если предположить, что объявление кодировки источника неверно, есть способ передать это (и, да, я знаю он может не отображаться, но для моего прецедента, который не имеет значения) – Joel

+0

+1 Также хороший ответ. – 2010-12-13 16:48:51

2

В добавлении ответа @Martin Honnen, указывая на то, что 153 не UNICODE точка для персонажа ™, но 8482 и @Jim Гаррисон из xsl:character-map Рекомендации для (если вы не можете правильно указать набор символов для источника входного сигнала), вот reazon для отчета об ошибке от http://www.w3.org/TR/xslt-xquery-serialization/#HTML_CHARDATA:

Некоторые символы, а именно управляющие символы # x7F- # x9F, являются юридическими в XML, но не в HTML. Это ошибка сериализации [err: SERE0014] до использует метод вывода HTML, когда такие символов появляются в экземпляре модели данных. Сериализатор MUST сигнализирует об ошибке.

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