2015-09-04 4 views
1

У меня есть длинный список xml-файлов, которые могут иметь разные кодировки. Я хотел бы просмотреть все файлы и распечатать их кодировки. Печать атрибута кодирования в заголовке XML является всего лишь первым шагом. (Следующий шаг после того, как я узнаю, как получить доступ к атрибуту кодирования будет использовать атрибут кодировки, чтобы проверить, если это ожидает кодирования.)Печать атрибута кодирования в файлах XML с помощью XSL

Это как ввод XML-файлы могут выглядеть следующим образом:

<?xml version="1.0" encoding="iso-8859-1"?> 
<Resource Name="text1" Language="de"> 
    <Text> 
    </Text> 
</Resource> 


<?xml version="1.0" encoding="utf-8"?> 
<Resource Name="file2" Language="ko"> 
    <Text> 
    </Text> 
</Resource> 

Xsl, который был сокращен до минимума, но все равно без успеха. Я думаю, что я не могу соответствовать заголовку XML, написав этот путь. Но как я могу что-то сопоставить в заголовке XML?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html"/> 

    <xsl:template match="/"> 
    <html> 
     <body> 
      <xsl:value-of select="@encoding"/> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

ответ

3

Псевдо-атрибут кодирования пролога XML больше не имеет значения после того, как вы прочитали XML с процессором, совместимым с XML. Если кодировка в прологе не соответствует используемой кодировке и, файл содержит символы, которые не могут быть представлены в этой кодировке.

Единственный способ, которым я знаю, чтобы использовать XSLT, чтобы получить кодировку, чтобы использовать функции unparsed-text (XSLT 2.0) или unparsed-text-lines (XSLT 3.0), а затем использовать регулярные выражения (replace или xsl:analyze-string, как XSLT 2.0) для разбора пролог вручную.

Поскольку XSLT (и большинство инструментов и процессоров, поддерживающих XML), см. XML не как текстовый файл, а как набор узлов с потоками символов, а не потоками байтов, требование чтения кодировки вряд ли когда-либо понадобится.

Если вы хотите знать кодировку функций, как document, doc или unparsed-text те функции, которые определены таким образом, что они будут читать кодировку из пролога и использовать. В XSLT 3.0 вы можете использовать try/catch, чтобы узнать, удалось ли ему разобрать файл. В XSLT 2.0 у вас есть doc-available, который вернет false, если кодировка не соответствует используемым байтам.

+0

О, я вижу ... Я подозревал, что пролог XML был особенным. Я использую функцию документа для обработки длинного списка, если файлы, на многих языках. «Нормальная» кодировка для большинства файлов в списке должна быть «iso-8859-1», однако иногда файл, например, польский или румынский, также получает эту кодировку. Затем этот файл необходимо проверить дополнительно, поскольку некоторые символы могут быть разрушены в процессе. Поэтому для этих файлов предпочтительно, чтобы они оставались в UTF-8 как можно дольше. – Gunilla

+0

@Gunilla: вы хотите сказать, что файлы закодированы как UTF-8, но имеют пролог с другой кодировкой? Лучшее, что вы можете сделать, это предварительно обработать список файлов и просто удалить пролог (просто удалить первую строку), поскольку кодировка по умолчанию, если пролог отсутствует, - это UTF-8 или UTF-16 (разница в том, что может автоматически определяться из спецификации). – Abel

+0

Хорошая идея! Если все файлы по умолчанию кодируются как UTF-8, если пролог отсутствует, никакие символы никогда не будут разрушены. И для тех файлов/языков, которые, как я знаю, перейдут в целевую систему, которая требует кодирования iso-8859-1, можно добавить пролог с кодировкой iso-8859-1 с использованием преобразования . Я думаю, что это упростит обслуживание этих файлов и уменьшит риск ошибок. Большое спасибо! – Gunilla