Разрешить недопустимые символы HTML в преобразовании XSLT - PullRequest
1 голос
/ 13 декабря 2010

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

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

вместо закодированного

™

В нынешнем виде Саксон выдает следующее исключение во время преобразования из 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;

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

Ответы [ 3 ]

4 голосов
/ 13 декабря 2010

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

РЕДАКТИРОВАТЬ: карта символов

<xsl:character-map name="TM">
  <xsl:output-character character="&#153;" string="&#x2122;"/>
</xsl:character-map>
2 голосов
/ 13 декабря 2010

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

Определенные символы, в частности управляющие символы # x7F- # x9F, являются законно в XML, но не в HTML. Это ошибка сериализации [err: SERE0014] в использовать метод вывода HTML, когда такой символы появляются в случае модель данных. НЕОБХОДИМО, чтобы сериализатор сигнализировать об ошибке.

2 голосов
/ 13 декабря 2010

Saxon - это XSLT-процессор, а не анализатор XML.Если вы получаете ошибки при синтаксическом анализе входных документов, то это жалоба синтаксического анализатора XML (а не Saxon), и это означает, что ваш ввод не является правильно сформированным 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.

...