XSLT-преобразование с символом 8221 - PullRequest
0 голосов
/ 26 января 2011

Я преобразую XML-документ, используя javax.xml.transform.Transformer и XSLT.Документ содержит символы «и» (Java Integer Code 8220 и 8221).Это не обычные кавычки.

Когда я преобразую документ, эти символы преобразуются в “ и ” Теперь моя борьба состоит в том, как преобразовать их обратно в то, что люди могут читать?Я попытался прочитать документ с помощью DOMReader и SAXReader, используя кодировки utf-8, utf-16, ascii и т. Д. Не повезло.

Ваша помощь очень ценится.Макс.

Ответы [ 3 ]

0 голосов
/ 26 января 2011

Этот вход:

<p> “ and ” </p>

С помощью этой таблицы стилей (просто правило идентификации):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Выход:

<p> “ and ” </p>

Только Xalan с html методом сериализации, вывод:

<p> &ldquo; and &rdquo; </p>

Итак, если вам нужна правильная рендеризация, вам нужно вывести правильный HTML-документ ...

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="utf-8"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/">
        <html>
            <head>
                <title>Test</title>
            </head>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Выход:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Test</title>
    </head>
    <body>
        <p> “ and ” </p>
    </body>
</html>

Примечание : правильная декларация кодировки кодировки.

0 голосов
/ 02 февраля 2011

Необходимо понимать, что XSL-преобразование применяется не к самому XML-документу, а к древовидному представлению этого документа (-ов). Текстовые узлы содержат значения в определенной кодировке независимо от того, как они были представлены во входном документе - после построения дерева они одинаковы. Во время преобразования вы просто создаете другое дерево, а затем оно сериализуется.

Некоторые символы, подобные тем, которые вы упомянули, требуют особой обработки в зависимости от выбранного формата назначения. В случае сериализации в XML-документ они «экранируются», а в случае сериализации в HTML - нет. Вот почему первый ответ дает вам обходной путь.

Однако разница между этими двумя методами в отношении экранирования заключается только в значении по умолчанию для атрибута " disable-output-escaping " (XSLT 1.0). В случае вывода XML он имеет значение «нет», а в случае HTML - «да».

Таким образом, чтобы исправить вашу проблему без изменения всего метода сериализации, вы можете написать что-то вроде этого, когда копируете какое-то значение, которое может содержать «специальные» символы:

<xsl:value-of select="/my/node/text()" disable-output-escaping="yes"/>

P.S. В XSLT 2.0 предпочтительный способ сделать это - использовать инструкцию отображения символов.

0 голосов
/ 26 января 2011

Это символы utf-8 201c и 201d. Вы переходите на HTML? Если это так, и ваш xslt определяет вывод HTML, я ожидаю, что он выведет &ldquo и &rldquo, так как они являются ссылками на символьные объекты: http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references Цитата из спецификации XSLT:

"Метод вывода html может выводить персонаж с использованием персонажа ссылка, если она определена для него в версия HTML, что вывод Метод использует. "

http://www.w3.org/TR/xslt#section-HTML-Output-Method

...