XML -> XSLT с использованием кодировки UTF-8 не работает с Microsoft Excel - почему? - PullRequest
0 голосов
/ 12 января 2019

У меня проблема с Microsoft Excel и моим сгенерированным "Textfile - csv" / "Textfile - tab".

Все приложения имеют кодировку UTF-8 и работают с немецкими умлаутами (äöüßÄÖÜ).
Notepad ++ (Windows 7) открывает файл и показывает все правильно
Редактор (Windows 7) открывает файл и показывает все правильно
Только ..... Excel открывает файл (если вы используете его без диалогового окна параметров импорта) с неправильной кодировкой и уничтожает все немецкие умлауты.

Я не нашел варианта в настройках Excel, чтобы избежать этой проблемы - возможно, я слепой или, возможно, Microsoft не справляется с работой Excel.

Есть ли способ в XSLT изменить что-либо, что excel выполнит свою работу правильно (без диалога параметров импорта - я знаю, это работает, если вы дадите им кодировку в этом диалоге)

Право в примере "Мюнхен", но Excel дает мне неправильный результат. Я не могу опубликовать результат Excel - выдает ошибку в поле ввода.

Я работаю только в XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <table name="test">
        <row>
            <field attr3="name">München</field>
        </row>
    </table>
</root>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
    <xsl:template match="/">
         <xsl:value-of select="root/table[@name = 'test']/row/field[@attr3 = 'name']"/>
    </xsl:template>
</xsl:stylesheet>

Результат сохраняется как .txt в файловой системе. Я пробовал также форматы, такие как .csv и .tab - все не работает с Excel ->, но всегда работает в notepad ++ / editor / .... Только «диалог импорта» в Excel дает символы в правильной форме - но пользователи хотят дважды щелкнуть файл.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

В таблице стилей XSLT 2.0 xsl: output имеет атрибут byte-order-mark .

Атрибут byte-order-mark определяет, записывается ли метка порядка байтов в начале файла. Если указано значение yes, записывается метка порядка байтов; если указано no, знак порядка байтов не записывается. Значение по умолчанию зависит от используемой кодировки. Если кодировка UTF-16, по умолчанию используется значение yes; для UTF-8 это , определяемое реализацией , а для всех других кодировок это no. Значение метки порядка байтов указывает, записаны ли байты старшего разряда до или после байтов младшего разряда; фактический используемый порядок байтов зависит от реализации , если только он не определен выбранной кодировкой.

Измените xsl:stylesheet на version="2.0" и добавьте byte-order-mark="yes" к xsl:output (и, очевидно, используйте движок XSLT 2.0):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no" byte-order-mark="yes" />
    <xsl:template match="/">
        <xsl:value-of select="root/table[@name = 'test']/row/field[@attr3 = 'name']"/>
    </xsl:template>
</xsl:stylesheet>
0 голосов
/ 12 января 2019

Excel требуется BOM (Byte Order Mark) для правильного чтения CSV в кодировке UTF-8. К сожалению, я не знаю, как добавить спецификацию через XSLT при использовании версии 1.0, но вы можете использовать какое-то внешнее приложение, чтобы сделать это как тривиальную задачу. Я сам написал некоторое время назад, если вам нужна ссылка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...