</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>
<?xml version='1.0' encoding='windows-1251'?>
<редкий>
<рыболов>
<может>
<забыть>
<как>
<плавает>
<щука/>
</плавает>
</как>
</забыть>
</может>
</рыболов>
</редкий>
Напомним, что кодировка выходящего документа определяется атрибутом encoding
элемента xsl:output
и не зависит от кодировок преобразования и обрабатываемых документов. Например, можно легко создать преобразование, которое будет изменять кодировку входящего документа. Это будет идентичное преобразование с элементом xsl:output
, определяющим целевой набор символов.
<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 — как во входящих документах, так и в самих преобразованиях.
Случай нескольких входящих документов
Базовая архитектура преобразования подразумевает один входящий документ. Несмотря на это, в преобразованиях можно использовать и обрабатывать информацию, хранящуюся в других, внешних документах. Доступ к этим документам можно получить при помощи функции document
.
Функция
Запись функции:
Функция document
позволяет обращаться к внешним документам по их URI, например
<xsl:copy-of select='document('http://www.w3.org')'/>
скопирует в выходящий документ содержимое главной страницы Консорциума W3.