Книга: Технология XSLT

Кодировки в XSLT-преобразованиях

Кодировки в XSLT-преобразованиях

Несмотря на то, что в логических деревьях, которыми манипулирует XSLT, текстовые узлы представляются в кодировке Unicode, очень часто в обрабатываемых документах бывает необходимо использовать также другие кодировки. К примеру, большинство русскоязычных документов хранятся в кодировках Windows-1251 и KOI8-R.

Если внимательно присмотреться к преобразованиям, можно заметить, что, как правило, в них участвуют минимум три документа — входящий (преобразовываемый) документ, документ преобразования (преобразующий) и выходящий (преобразованный документ). Соответственно, каждый из них может иметь собственную кодировку.

Кодировка входящего документа указывается в его xml-декларации. Например, документы в кодировке Windows-1251 должны иметь xml-декларацию вида

<?xml version="1.0" encoding="windows-1251"?>

Возможно, небольшим сюрпризом окажется то, что в соответствии со стандартом XML, имена тегов вовсе не обязаны состоять исключительно из латинских букв. В имени элемента можно использовать весь кириллический алфавит, а также множество других символов. Совершенно корректным будет документ

<?xml version="1.0" encoding="windows-1251"?>
<страница>
 <содержимое/>
</страница>

Аналогичным образом кириллицу, а также другие наборы символов и алфавиты можно использовать и в самих преобразованиях, поскольку те в свою очередь также являются XML-документами.

Пример

Листинг 8.57. Входящий документ

<?xml version="1.0" encoding="windows-1251"?>
<каждый>
 <охотник>
  <желает>
   <знать>
    <где>
     <сидит>
      <фазан/>
     </сидит>
    </где>
   </знать>
  </желает>
 </охотник>
</каждый>

Листинг 8.58. Преобразование

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet
 version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output indent="yes" encoding="windows-1251"/>
 <xsl:template match="каждый">
  <редкий>
   <xsl:apply-templates/>
  </редкий>
 </xsl:template>
 <xsl:template match="охотник">
  <рыболов>
   <xsl:apply-templates/>
  </рыболов>
 </xsl:template>
 <xsl:template match="желает/знать">
  <может>
   <забыть>
    <xsl:apply-templates/>
   </забыть>
  </может>
 </xsl:template>
 <xsl:template match="где">
  <как>
   <xsl:apply-templates/>
  </как>
 </xsl:template>
 <xsl:template match="сидит">
  <плавает>
   <xsl:apply-templates/>
  </плавает>
 </xsl:template>
 <xsl:template match="фазан">
  <щука>
   <xsl:apply-templates/>
  </щука>
 </xsl:template>
</xsl:stylesheet>

Листинг 8.59. Выходящий документ

<?xml version="1.0" encoding="windows-1251"?>
<редкий>
 <рыболов>
  <может>
   <забыть>
    <как>
     <плавает>
      <щука/>
     </плавает>
    </как>
   </забыть>
  </может>
 </рыболов>
</редкий>

Напомним, что кодировка выходящего документа определяется атрибутом encoding элемента xsl:output и не зависит от кодировок преобразования и обрабатываемых документов. Например, можно легко создать преобразование, которое будет изменять кодировку входящего документа. Это будет идентичное преобразование с элементом xsl:output, определяющим целевой набор символов.

Листинг 8.60. Преобразование, изменяющее кодировку документа на KOI8-R

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output encoding="KOI8-R"/>
 <xsl:template match="@*|node()">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

Как можно видеть, XSLT довольно гибко поддерживает кодировки — входящие и выходящие документы, а также сами преобразования могут иметь разные наборы символов. Единственным ограничением является множество кодировок, поддерживаемое самим процессором, вернее парсером, который он использует для разбора входящих документов, и сериализатором, который служит для создания физического экземпляра выходящего документа.

Практически во всех процессорах поддерживаются кодировки UTF-8, US- ASCII и ISO-8859-1, но далеко не все могут работать с Windows-1251 или KOI8-R. Поэтому, создавая документы и преобразования в нестандартных кодировках, мы заведомо ограничиваем переносимость решений. В случаях, когда XML/XSLT приложения создаются под конкретный процессор с заведомо известными возможностями, это не является большой проблемой, однако в тех случаях, когда требуется универсальность или точно не известно, каким процессором будет производиться обработка, единственным выходом будет использовать UTF-8 — как во входящих документах, так и в самих преобразованиях.

Оглавление книги


Генерация: 1.869. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз