Объекты HTML неправильно отображаются в браузере после преобразования XSLT

У меня есть следующий XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <contactInfo>
        <id>12319221</id>
        <name>Jerry P</name>
        <market>
            <name>Test</name>
            <phone>800.555.1010</phone>
        </market>
        <agent>
            <name>Test User</name>
            <email>[email protected]</email>
        </agent>
        <summary>&amp;#8220;Jerry just gets it!&amp;#8221;</summary>
    </contactInfo>
</example>

Я кодирую специальные символы как объекты html, когда сохраняю этот XML-документ, поэтому умные кавычки кодируются как «и ”.

И я использую XSL через Java/Xalan для преобразования документа xml в html:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="wsHost"></xsl:param>
<xsl:param name="serverId"></xsl:param>

<xsl:template match="/showcase">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title>Example</title>
        </head>
        <body>
            <div id="profile">
                <xsl:apply-templates/>
            </div>
        </body>
    </html>
</xsl:template>

<!-- Contact Info section -->
<xsl:template match="/example/contactInfo">
    <span class="sectionTitle">Contact Info:</span>
    <div id="contactInfo">
        <xsl:if test="name">
            <strong>Candidate Name:</strong>&#160;<xsl:value-of disable-output-escaping="yes" select="name" /><br />
        </xsl:if>

        <xsl:if test="id">
            <strong>Candidate ID:</strong>&#160;<xsl:value-of disable-output-escaping="yes" select="id" /><br />
        </xsl:if>

        <xsl:if test="market">
            <xsl:if test="market/name">
                <strong>Market Name:</strong>&#160;<xsl:value-of disable-output-escaping="yes" select="market/name" /><br />
            </xsl:if>

            <xsl:if test="market/phone">
                <strong>Market Phone:</strong>&#160;<xsl:value-of disable-output-escaping="yes" select="market/phone" /><br />
            </xsl:if>
        </xsl:if>

        <xsl:if test="agent">
            <xsl:if test="agent/name">
                <strong>Agent Name:</strong>&#160;<xsl:value-of disable-output-escaping="yes" select="agent/name" /><br />
            </xsl:if>

            <xsl:if test="agent/email">
                <strong>Agent Email:</strong>&#160;<xsl:value-of disable-output-escaping="yes" select="agent/email" /><br />
            </xsl:if>
        </xsl:if>

        <xsl:if test="summary">
                <strong>Summary:</strong>&#160;<xsl:value-of disable-output-escaping="yes" select="summary" /><br />
        </xsl:if>
    </div>
    <hr size="1" noshade="noshade" class="rule" />
</xsl:template>
</xsl:stylesheet>

HTML-код, полученный в результате преобразования, затем записывается в браузер. Вот где я заметил проблему с кодировкой символов.   (числовое значение) отображается либо в виде вопросительного знака черного ромба (firefox), либо в виде квадрата (т. е.), как и ранее закодированные объекты ("/").

Кроме того, возможно, самый большой намек на то, что при преобразовании этого xml-файла на платформе Linux (затем записи html в firefox) все отображается правильно. Только когда преобразование выполняется из окон, возникают проблемы с кодировкой символов (как в firefox, так и в ie).

Я неправильно кодирую сущности или, может быть, где-то не указываю набор символов?


person abargnesi    schedule 10.12.2009    source источник


Ответы (2)


Вы говорите, что используете Java/Xalan. Вы предоставляете выходной поток или потоковую запись? Если это так, вам нужно явно установить кодировку в этот момент:

... new OutputStreamWriter(stream,"UTF-8");

Просто включение заголовков UTF8 на самом деле не приводит к тому, что выходной файл кодируется UTF8.

person Jim Garrison    schedule 10.12.2009
comment
Согласованный. Если вы изучите вывод HTML из окна Windows в шестнадцатеричном просмотрщике, вы, вероятно, увидите умные кавычки как 93 и 94, а NBSP как A0 - их кодировки Windows-1252. Он работает так, как вы ожидаете, на вашем компьютере с Linux, потому что UTF-8 является кодировкой по умолчанию для этой платформы. - person Alan Moore; 11.12.2009

Ну, вы не установили кодировку в HTML-документе для одного. Не знаю, в этом ли проблема, но это будет моя первая попытка исправить.

попробуйте добавить:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

к твоей голове.

person prodigitalson    schedule 10.12.2009
comment
Итак, я добавил: ‹xsl:output method=html standalone=yes version=1.0 encoding=UTF-8 indent=yes/› и теперь полученный html получил метатег с типом контента: ‹META http-equiv= Content-Type content=text/html; charset=UTF-8> Я хочу иметь возможность отображать теги html, содержащиеся в исходном xml (html может быть неправильно сформирован), что потребует от меня не переходить в lt;. Но мне тоже нужно сбежать — на #8212; (длинный символ дефиса), в противном случае они отображаются как блоки из окон (как firefox, так и ie). Должен ли я избегать одних, а не других? - person abargnesi; 10.12.2009
comment
Честно говоря, я опубликовал ответ, потому что отсутствие кодировки, прикрепленной к HTML, подскочило ко мне ... Я очень мало использовал XSL / XSLT, поэтому я не уверен, что смогу точно ответить на ваш комментарий. Но мне интересно, как это может изменить ситуацию, если вы добавите html NS к определенным элементам в файле xml... Поможет ли это каким-либо образом вашему преобразованию? или это не пойдет из-за возможного уродства? Также было бы лучше обернуть содержимое элементов, содержащих html, в разделы CDATA? - person prodigitalson; 10.12.2009