<xsclass="underline" stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" preserve-space elements="c"/>
<xsclass="underline" strip-space elements="e t:*"
xmlns:t="urn:d"/>
<xsclass="underline" template match="/">
<xsclass="underline" copy-of select="/"/>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
<?xml version="1.0" encoding="utf-8"?><a xmlns:d="urn:d">¶
□□<d:b><c>¶
□□□□□□<e/>¶
□□□□</c></d:b>¶
</a>
Сообщения процессора
По большому счету, мы не можем контролировать процесс преобразования. Процессор может сам выбирать, как и в какой последовательности он будет выполнять те или иные шаблоны — таковы особенности декларативного программирования. Вместе с тем мы все-таки можем получить кое-какую информацию о ходе преобразования, используя механизм, называемый в XSLT сообщениями.
Элемент xsclass="underline" message
Синтаксис этого элемента дан ниже:
<xsclass="underline" message
terminate="yes" | "no">
<!-- Содержимое: шаблон -->
</xsclass="underline" message>
Элемент xsclass="underline" message указывает процессору на то, что он должен вывести сообщение, которое является результатом обработки шаблона, содержащегося в этом элементе. Механизм вывода сообщения зависит от реализации того или иного процессора и может быть различным — от вывода текста сообщения на экран до вызова внешнего модуля для обработки сообщения.
Иногда в процессе отладки преобразования бывает полезно выводить сообщения о том, какой элемент обрабатывается в данный момент.
<a><b><c><d/></c></b></a>
<xsclass="underline" stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="*">
<element name="{name()}">
<xsclass="underline" message>
<xsclass="underline" text>Processing element </xsclass="underline" text>
<xsclass="underline" value-of select="name()"/>
<xsclass="underline" if test="parent::*">
<xsclass="underline" text> which has a parent element </xsclass="underline" text>
<xsclass="underline" value-of select="name(..)"/>
</xsclass="underline" if>
<xsclass="underline" text>.</xsclass="underline" text>
</xsclass="underline" message>
<xsclass="underline" apply-templates/>
</element>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
<element name="a">
<element name="b">
<element name="c">
<element name="d"/>
</element>
</element>
</element>
Processing element a.
Processing element b which has a parent element a.
Processing element с which has a parent element b.
Processing element d which has a parent element c.
Атрибут terminate указывает на то, должен ли процессор прекратить дальнейшую обработку документа или нет. Значением этого атрибута по умолчанию является "no", что означает, что процессор должен просто вывести сообщения и продолжать дальнейшее выполнение шаблона. Если же в xsclass="underline" message указано terminate="yes", то процессор, выведя сообщение, прервет обработку. Этот прием может использоваться, например, для того, чтобы проверять входящие документы на соответствие определенной схеме.
При помощи xsclass="underline" message мы можем запретить обработку документов, которые не имеют в корне элемент с именем "html" в любом регистре символов.
<xsclass="underline" template match="/">
<xsclass="underline" if test="translate(name(*),'html','HTML')!='HTML'">
<xsclass="underline" message terminate="yes">
<xsclass="underline" text>Document has no root HTML element.</xsclass="underline" text>
</xsclass="underline" message>
</xsclass="underline" if>
</xsclass="underline" template>
Если мы будем обрабатывать документ вида
<hTmL>
<body/>
</hTmL>
обработка не будет прервана, в то время как преобразование документа
<ht-ml>
<body/>
</ht-ml>
будет прервано сообщением:
Document has no root HTML element:
Processing terminated using xsclass="underline" message
Сортировка
При преобразовании документа элементами xsclass="underline" for-each и xsclass="underline" apply-templates, выбранные узлы по умолчанию обрабатываются в порядке просмотра документа, который зависит от выражения, использованного в атрибуте select этих элементов. XSLT позволяет изменять этот порядок посредством использования механизма сортировки.
Элементы xsclass="underline" for-each и xsclass="underline" apply-templates могут содержать один или несколько элементов xsclass="underline" sort, которые позволяют предварительно сортировать обрабатываемое множество узлов.
Элемент xsclass="underline" sort
Синтаксис этого элемента определяется в XSLT как:
<xsclass="underline" sort
select = "выражение"
lang = "язык"
data-type = "text" | "number" | "имя"
order = "ascending" | "descending"
case-order = "upper-first" | "lower-first" />
В случае если xsclass="underline" for-each и xsclass="underline" apply-templates содержат элементы xsclass="underline" sort, обработка множества узлов должна производиться не в порядке просмотра документа, а в порядке, который определяется ключами, вычисленными при помощи xsclass="underline" sort. Первый элемент xsclass="underline" sort, присутствующий в родительском элементе, определяет первичный ключ сортировки, второй элемент — вторичный ключ, и так далее.
Элемент xsclass="underline" sort обладает атрибутом select, значением которого является выражение, называемое также ключевым выражением. Это выражение вычисляется для каждого узла обрабатываемого множества, преобразуется в строку и затем используется как значение ключа при сортировке. По умолчанию значением этого атрибута является ".", что означает, что в качестве значения ключа для каждого узла используется его строковое значение.