69061

Создание текстовых узлов в XSLT

Лекция

Информатика, кибернетика и программирование

Символьные данные, содержащиеся в документе, организуются в виде текстовых узлов. Последовательности символов, встречающиеся в документах, в целях экономии никогда не разбиваются на два или более текстовых узла, а текстовые узлы никогда не бывают пустыми.

Русский

2014-09-29

212.5 KB

1 чел.

 24

Лекция 4-09

5.3.9. Создание текстовых узлов в XSLT

 5.3.9.1. Элемент xsl:text

 5.3.9.2. Элемент xsl:value-of 

 5.3.9.3. Встроенные правила шаблона 

 5.3.9.4. Обработка пробельных символов

5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен в XSLT

 5.3.10.1. Элемент xsl:document

 5.3.10.2. Элемент xsl:result-document

5.3.10.3. Элемент xsl:comment

 5.3.10.4. Элемент xsl:processing-instruction

 5.3.10.5. Элемент xsl:namespace

5.3.11. Копирование узлов в XSLT

 5.3.11.1. Элемент xsl:copy

 5.3.11.2. Элемент xsl:copy-of

 5.3.11.3. Элемент xsl:sequence

5.3.12. Условная и циклическая обработка в XSLT

 5.3.12.1. Элемент xsl:if

 5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise

 5.3.12.3. Элемент xsl:for-each

 5.3.12.4. Сортировка в XSLT

5.3.13. Сообщения процессора XSLT

5.3.14. Псевдонимы пространства имен в XSLT

5.3.15. Нумерация в XSLT

5.3.9. Создание текстовых узлов в XSLT

Символьные данные, содержащиеся в документе, организуются в виде текстовых узлов. Последовательности символов, встречающиеся в документах, в целях экономии никогда не разбиваются на два или более текстовых узла, а текстовые узлы никогда не бывают пустыми. Содержание секций CDATA обрабатываются так, как если бы их содержимое было просто включено в документ с заменой символов "<" и "&", на сущности &lt; и &amp;.

Текст, содержащийся в значениях атрибутов, а также в комментариях и инструкциях по обработке не оформляется в виде текстовых узлов – эти  данные в XSLT принадлежат соответствующим узлам атрибутов, комментариев и инструкций.

Шаблон преобразования может содержать текстовые узлы, которые при выполнении шаблона после обработки пробельных символов будут попросту скопированы в результирующее дерево.  

Текстовые узлы могут также быть созданы элементами xsl:text и xsl:value-of.

5.3.9.1. Элемент xsl:text

Элемент xsl:text используется для создания текстовых узлов, содержащих пробельные и специальные символы, и имеет следующий синтаксис:

<xsl:text>

 <!--

 Содержимое: символьные данные (#PCDATA) 

 -->

</xsl:text>

При использовании xsl:text преобразования будут сохранять пробельные символы, находящиеся в элементе xsl:text, т.е., для того чтобы вывести в выходящий документ пробельный символ, например такой, как символ перевода строки, достаточно написать

<xsl:text>&#10;</xsl:text>.

Символьные данные, включенные в элемент xsl:text, ведут себя так же, как и литеральные данные, заданные вне xsl:text, за исключением возможности задания в xsl:text управляющих символов типа перехода на новую строку.

5.3.9.2. Элемент xsl:value-of

Элемент xsl:value-of выводит в выходящее дерево строковый результат вычисления выражений и имеет следующий синтаксис:.

<xsl:value-of

select="выражение"

separator="строка"

>

 <!--

 Содержимое: конструктор последовательности 

 -->

</xsl:value-of>

Необязательный атрибут select задает строковое значение нового текстового узла (альтернативным является задание значения нового текстового узла в конструкторе последовательности элемента xsl:value-of).

Необязательный атрибут separator задает символы-разделители между элементами сгенерированной последовательности при их преобразовании в результирующее строковое значение текстового узла. По умолчанию таким разделителем является одиночный пробел. Если в качестве разделителя задана пустая строка, разделителей между элементами не будет.

5.3.9.3. Встроенные правила шаблона

В спецификации определены несколько встроенных  правил шаблона, которые должен реализовать любой процессор XSLT.

Первое встроенное правило шаблона позволяет рекурсивно продолжать обработку в отсутствии успешного сравнения с явным правилом шаблона в стиле. Это правило шаблона используется как для узлов элементов, так и для корневого узла и определяется следующим образом:

<xsl:template match="*|/">

  <xsl:apply-templates/>

</xsl:template>.

Для каждого метода также есть встроенное правило шаблона, позволяющее рекурсивно продолжать обработку в том же самом режиме, в отсутствии успешного сравнения с образцом из явного правила шаблона в этом стиле. Это правило шаблона применяется как для узлов элементов, так и для корневого узла. Далее приведен эквивалент встроенного правила шаблона для режима m.

<xsl:template match="*|/" mode="m">

  <xsl:apply-templates mode="m"/>

</xsl:template>.

Также есть встроенное правило шаблона для текстовых узлов и узлов атрибутов, которое просто копирует текст:

<xsl:template match="text()|@*">

  <xsl:value-of select="."/>

</xsl:template>.

Для инструкций обработки и комментариев встроенное правило шаблона не должно делать ничего:

<xsl:template match="processing-instruction()|comment()"/>

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

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

Пример использования элементов xsl:text и xsl:value-of:

Следующая таблица стилей формирует документ HTML для оглавления тем сообщений и самих сообщений  для документа XML message.xml:

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

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output  

   method="html"

   encoding="Windows-1251"

   indent="yes"/>   

 <xsl:template match="/">

   <html>

     <head>

   <title>Вывод оглавления и списка сообщений</title>

 </head>

 <body>

   <xsl:apply-templates select="//header/subject"

     mode="contents"/>

   <xsl:apply-templates select="message"/>

 </body>

 </html>

 </xsl:template>

 <xsl:template match="subject" mode="contents">

   <xsl:text

  disable-output-escaping="yes">&lt;a href="#m</xsl:text>

   <xsl:value-of select="position()"/>

   <xsl:text

     disable-output-escaping="yes">"&gt;</xsl:text>

   <xsl:value-of select="position()"/>

   <xsl:text>. </xsl:text>

   <xsl:value-of select="."/>

   <xsl:text

   disable-output-escaping="yes">&lt;/a&gt;</xsl:text>

        <br />

 </xsl:template>

 <xsl:template match="header">

        <br /><br />

   <xsl:text

    disable-output-escaping="yes">&lt;a name=m"</xsl:text>

   <xsl:value-of

     select="count(preceding-sibling::header)+1"/>

   <xsl:text

  disable-output-escaping="yes">"&gt;&lt;h3&gt;</xsl:text>

   <xsl:text>Сообщение </xsl:text>

   <xsl:value-of

select="count(preceding-sibling::header)+1"/>

 <xsl:text

disable-output-escaping="yes">&lt;/h3&gt;&lt;/a&gt;</xsl:text>

   <xsl:apply-templates select="from"/>

   <xsl:apply-templates select="to"/>

   <xsl:apply-templates select="subject"/>

 </xsl:template>

 <xsl:template match="from">

       <p>От:

   <xsl:value-of select="@address"/>

   </p>

      </xsl:template>

 <xsl:template match="to">

  <p>Кому:

   <xsl:value-of select="@address"/>

      </p>

      </xsl:template>

 <xsl:template match="subject">

  <p>Тема:

   <xsl:value-of select="."/>

  </p>

 </xsl:template>

 <xsl:template match="body">

 <p>Текст:

   <xsl:value-of select="."/>

 </p>

 </xsl:template>

</xsl:stylesheet>.

В результате преобразования тело документа HTML будет иметь следующий вид:

<html>

 <head>

   <meta http-equiv="Content-Type"

     content="text/html; charset=Windows-1251">

   <title>Вывод оглавления и списка сообщений</title>

 </head>

 <body>

   <a href="#m1">1. Поздравление</a><br>

   <a href="#m2">2. Напоминание</a><br>

   <br /><br />

   <a name="m1"><h3>Сообщение 1</h3></a>

   <p>От: ivanov@mail.com</p>

   <p>Кому: petrov@mail.com</p>

   <p>Тема: Поздравление</p>

   <p>Текст: Поздравляю с днем рождения!</p>

   <br /><br />

   <a name="m2"><h3>Сообщение 2</h3></a>

   <p>От: ivanov@mail.com</p>

   <p>Кому: sidorov@mail.com</p>

   <p>Тема: Напоминание</p>

   <p>Текст: Встречаемся в 10.00.</p>

 </body>

</html>. 

и в Web-браузере будет выведено:

1. Поздравление

2. Напоминание

Сообщение 1

От: ivanov@mail.com

Кому: petrov@mail.com

Тема: Поздравление

Текст: Поздравляю с днем рождения!

Сообщение 2

От: ivanov@mail.com

Кому: sidorov@mail.com

Тема: Напоминание

Текст: Встречаемся в 10.00..

5.3.9.4. Обработка пробельных символов

В XSLT выделяются четыре пробельных символа, обработка которых несколько отличается от обработки других символов. Это следующие символы:

  •  пробел (десятичный код: #32, шестнадцатеричный код #x20);
  •  перевод строки (десятичный код: #10, шестнадцатеричный код #xA);
  •  возврат каретки (десятичный код: #13, шестнадцатеричный код #xD);
  •  горизонтальная табуляция (десятичный код: #9, шестнадцатеричный код #x9).

При обработке процессором XSLT текстовый узел будет сохранен при выполнении хотя бы одного из следующих условий.

  •  Он содержит хотя бы один непробельный символ.
  •  Он принадлежит элементу, в котором сохранение пробельных символов задано средствами XML, а именно атрибутом xml:space со значением preserve.
  •  Он принадлежит элементу, имя которого включено во множество имен элементов, для которых нужно сохранять пробельные символы.

Во всех остальных случаях текстовый узел будет удален.

Для преобразований сохраняющее множество состоит из единственного элемента xsl:text, то есть единственный элемент в преобразовании, для которого пробельные текстовые узлы не будут удаляться, – это  элемент xsl:text. Поэтому его часто используют для вывода в выходящем документе пробельных символов.

Для входящих документов сохраняющее множество состоит из имен всех элементов. То есть по умолчанию преобразования сохраняют все пробельные текстовые узлы. Для изменения сохраняющего множества элементов входящего документа используются элементы xsl:preserve-space и xsl:strip-space.

Эти элементы имеют следующий синтаксис:

<xsl:preserve-space

elements="имена"

/>

<xsl:strip-space

elements="имена"

/>

Элемент xsl:preserve-space добавляет, a xsl:strip-space удаляет имя элемента из сохраняющего множества входящего документа.

Обязательные атрибуты elements элементов xsl:strip-space и xsl:preserve-space содержат либо значение "*", либо список имен, разделенных пробелами.

Значение "*" используется для выбора произвольных имен. Ему будут соответствовать любые имена элементов.

Имя в списке может быть  либо именем элемента, либо иметь форму "префикс:*". В первом случае выбор будет производиться для всех элементов с заданным именем, например, для удаления пробельных символов в элементах d и c в преобразовании достаточно указать:

<xsl:strip-space elements="d c"/>.

Во втором случае будет производиться выбор всех элементов в данном пространстве имен. Например, если в документе определен префикс пространства имен upr в виде атрибута xmlns:upr="http://www.upr.com", проверке имени "upr:*" будут соответствовать все элементы пространства имен, определяемого идентификатором "http://www.upr.com".

5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен в XSLT

5.3.10.1. Элемент xsl:document

Новый узел документа создается с помощью следующей инструкции:

<xsl:document

  type="имя"

validation="strict" | "lax" | "preserve" | "strip"

>

  <!--

 Содержимое: конструктор последовательности 

 -->

</xsl:document>

Атрибут type задает проверку создаваемого узла документа на соответствие типу, заданному в значении атрибута и определенному в схеме документа.

Атрибут validation определяет действия по проверке действительности создаваемого атрибута. Значения "preserve" и "strip" не требуют проверки узлов документа, причем в первом случае копируемые в новый документ узлы элементов и атрибутов сохраняют свой тип, а во втором – элементы получают тип xs:untyped, а    атрибуты – тип xs:untypedAtomic. Если же задано значение "strict" или "lax", то в случае, если наследниками узла документа не является один узел элемента, а также, возможно, узлы комментариев и инструкций по обработке, выдается сообщение об ошибке. Затем выполняется проверка дочернего узла элемента в документе. Если проверяемый узел не соответствует своей схеме, также  выдается сообщение об ошибке.

Атрибуты type и validation являются взаимоисключающими, т.е. в элементе может быть задан только один из этих атрибутов.

5.3.10.2. Элемент xsl:result-document

Элемент-инструкция xsl:result-document используется для создания конечной результирующей иерархической структуры и имеет следующий синтаксис:

<xsl:result-document

  format="имя"

  href="URI"

type="имя-типа"

 validation="strict" | "lax" | "preserve" | "strip"

  method="xml" | "html" |  "xhtml" | "text" | "имя"

  byte-order-mark="yes" | "no"  

  cdata-section-elements="имена"

  doctype-public="строка"

  doctype-system="строка"

  encoding="строка"

  escape-uri-attributes="yes" | "no"

  include-content-type="yes" | "no"

  indent="yes" | "no"

  media-type="строка"

  normalization-form="NFC" | "NFD" | "NFKC" | "NFKD" |

 "fully-normalized" | "none" | "имя"

  omit-xml-declaration="yes" | "no"

  standalone="yes" | "no" | "omit"

  undeclare-prefixes="yes" | "no"

  use-character-maps="имена"

  output-version="строка"

>

  <!--

 Содержимое: конструктор-последовательности

 -->

</xsl:result-document>

Все атрибуты элемента result-document являются необязательными.

Атрибуты type и validation действуют так же, как в элементе xsl:element.

Атрибуты byte-order-mark, cdata-section-elements, doctype-public, doctype-system, encoding, escape-uri-attributes, include-content-type, indent, media-type, normalization-form, omit-xml-declaration, standalone, undeclare-prefixes и use-character-maps действуют так же, как в элементе xsl:output. За исключением атрибута use-character-maps, все эти атрибуты могут иметь вычисляемые значения.

Атрибут output-version действует так же, как и атрибут version  элемента xsl:output.

Атрибут format задает имя, к которому добавляется префикс пространства имен (если он есть) в области видимости элемента result-document. Расширенное значение имени должно соответствовать одному из имен в именованных элементах xsl:output. В этом случае формирование выходного документа будет выполняться под управлением именованного определения вывода xsl:output с заданным именем. Если  атрибут format не задан,  формирование выходного документа будет выполняться под управлением неименованного определения вывода xsl:output.

Атрибут href задает базовый URI узла документа в корне конечной результирующей иерархической структуры.

5.3.10.3. Элемент xsl:comment

Элемент-инструкция xsl:comment создает в результирующем дереве узел комментария. Текстом комментария становится результат выполнения шаблона, который содержится в элементе xsl:comment. Этот элемент имеет следующий синтаксис:

<xsl:comment

select="выражение"

>

 <!--

 Содержимое: конструктор последовательности 

 --> 

</xsl:comment>

Необязательный атрибут select задает строковое значение нового текстового узла (альтернативным является задание значения нового текстового узла в конструкторе последовательности элемента xsl:comment).

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

Пример создания комментария:

Элемент:

<xsl:comment>

&#xA; Новое сообщение&#xA;

</xsl:comment>

создаст в документе XML или HTML комментарий:

<!--

Новое сообщение 

-->.

5.3.10.4. Элемент xsl:processing-instruction

Элемент xsl:processing-instruction создает в результирующем дереве узел инструкции по обработке и имеет следующий синтаксис:

<xsl:processing-instruction

name="имя"

select="выражение"

>

<!--

 Содержимое: конструктор последовательности 

 --> 

</xsl:processing-instruction>

Обязательный атрибут name определяет имя целевого приложения, которому будет адресована инструкция по обработке. В этом атрибуте может быть указано вычисляемое выражение.

Необязательный атрибут select задает строковое значение новой инструкции по обработке (альтернативным является задание строкового значения новой инструкции по обработке в конструкторе последовательности элемента xsl:processing-instruction).

Инструкция по обработке не может содержать последовательности символов "?>".

Если результат выполнения шаблона содержит такую комбинацию, процессор может либо выдать ошибку, либо разделить символы "?" и ">" пробелом: "? >".

Имя инструкции по обработке, должно быть корректным именем XML (но не равным при этом "xml" в любом регистре символов).

Пример создания инструкции по обработке:

Элемент:

<xsl:processing-instruction name="servlet">

<xsl:text>links="follow"</xsl:text>

</xsl:processing-instruction>

создаст в выходном документе XML следующую инструкцию по обработке:

<?servlet links="follow"?>.

5.3.10.5. Элемент xsl:namespace

Узел пространства имен создается с помощью следующей инструкции:

<xsl:namespace

name="имя"

select="выражение"

>

<!--

 Содержимое: конструктор последовательности 

 --> 

</xsl:namespace>

Обязательный атрибут name задает имя узла, т.е. префикс пространства имен. В этом атрибуте может быть указано вычисляемое выражение. Если в качестве значения атрибута name задана пустая строка, узел пространства имен добавляется к пространству имен по умолчанию.

Необязательный атрибут select задает строковое значение нового пространства имен (альтернативным является задание строкового значения нового пространства имен в конструкторе последовательности элемента xsl:namespace).

5.3.11. Копирование узлов в XSLT

Преобразование может включать в себя не только создание новых, но и копирование существующих узлов. Для этого можно использовать элементы xsl:copy и xsl:copy-of, а также элемент xsl:sequence.

5.3.11.1. Элемент xsl:copy

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

Элемент-инструкция xsl:copy имеет следующий синтаксис:

<xsl:copy

copy-namespaces="yes" | "no"

inherit-namespaces="yes" | "no"                                       

use-attribute-sets="имена"

type="имя-типа"

  validation="strict" | "lax" | "preserve" | "strip"

>   

 <!--

 Содержимое: конструктор последовательности 

 -->

</xsl:copy>

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

Атрибут copy-namespaces задает ("yes") или отменяет ("no")  копирование  узлов пространства имен исходного элемента в  результирующий элемент.  По умолчанию значение этого атрибута равно "yes".

Атрибут inherit-namespaces задает ("yes") или отменяет ("no")  наследование узлов пространства имен для потомков создаваемого элемента. По умолчанию значение этого атрибута равно "yes".

Атрибут use-attribute-sets перечисляет (через пробел) имена наборов атрибутов, которые должны быть включены в копируемый элемент.

Атрибут type задает проверку копируемого узла документа, элемента или атрибута  на соответствие типу, заданному в значении атрибута и определенному в схеме документа.

Атрибут validation определяет действия по проверке действительности копируемого элемента. Значение "strip" этого атрибута указывает, что копируемый элемент и все содержащиеся в нем узлы должны иметь тип xs:untyped. Значение "preserve" указывает, что копируемые элементы сохраняют свой тип. Значение "strict" указывает, что копируемые элементы должны строго соответствовать своему типу, определенному в схеме документа (в случае такого несоответствия выдается сообщение об ошибке). Значение "lax" аналогично значению "strict", за исключением того, что в случае несоответствия сообщения об ошибке не выдается, а копируемые элементы будут иметь тип xs:untyped.

Атрибуты type и validation являются взаимоисключающими, т.е. в элементе может быть задан только один из этих атрибутов.

Содержимым xsl:copy является конструктор последовательности, который создается процессором и затем включается в создаваемый элемент.

5.3.11.2. Элемент xsl:copy-of

Элемент xsl:copy-of имеет следующий синтаксис:

<xsl:copy-of

select = "выражение"

copy-namespaces="yes" | "no"

type="имя-типа"

  validation="strict" | "lax" | "preserve" | "strip"

/>

Использование элемента xsl:copy-of полностью аналогично использованию элемента xsl:value-of за тем исключением, что xsl:copy-of при выводе значения выражения преобразует его к строке не во всех случаях. Поведение xsl:copy-of зависит от того, какой тип данных возвращает выражение, заданное в обязательном атрибуте select.

Если результат вычисления имеет булевский, числовой или строковый тип, то xsl:copy-of выводит его в виде текстового узла. В этом случае поведение xsl:copy-of не отличается от поведения элемента xsl:value-of.

Если результатом вычисления выражения является последовательность узлов, то xsl:copy-of копирует в выходящий документ все узлы в порядке просмотра документа вместе с их потомками.

Если результатом вычисления является узел документа, то он копируется в выходящий документ в неизмененном виде.

Атрибуты type и validation в элементе xsl:copy-of действуют так же, как в элементе xsl:copy.

Пример использования элементов xsl:copy и xsl:copy-of:

Следующая таблица стилей формирует копию  второго сообщения в документе XML message.xml с добавлением  еще одного адресата сообщения (второго элемента to в заголовке сообщения):

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

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output

method="xml"

encoding="Windows-1251"

indent="yes"

/>

<xsl:template match="text()">

<xsl:apply-templates/>

</xsl:template>

<xsl:template match="header[position()=2]">

<xsl:copy>

 <xsl:copy-of select="./from"/>

 <xsl:copy-of select="./to"/>

 <xsl:element name="to">

<xsl:attribute name="address">ivanenko@mail.com</xsl:attribute>

 </xsl:element>

 <xsl:copy-of select="./subject"/>

</xsl:copy>

</xsl:template>

<xsl:template match="body[position()=2]">

<xsl:copy-of select="."/>

</xsl:template>

</xsl:stylesheet>.

В результате этого преобразования выходной документ XML будет иметь следующий вид:

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

<header>

  <from address="ivanov@mail.com"/>

  <to address="sidorov@mail.com"/>

  <to address="ivanenko@mail.com"/>

  <subject>Напоминание</subject>

</header>

<body>Встречаемся в 10.00.</body>.

5.3.11.3. Элемент xsl:sequence

Элемент-инструкция xsl:sequence используется в содержимом конструктора последовательности для создания последовательности узлов или атомарных значений. Этот элемент в XSLT 2.0 имеет следующий синтаксис:

<xsl:sequence
    select ="выражение"

/>

Атрибут select задает выражение, результатом вычисления которого является последовательность узлов или атомарных значений.

В отличие от многих других инструкций, элемент может возвращать последовательность уже существующих узлов, а не создавать новые узлы.

5.3.12. Условная и циклическая обработка в XSLT

В XSLT имеются два элемента, которые поддерживают условную обработку – xsl:if и xsl:choose.

5.3.12.1. Элемент xsl:if

Элемент xsl:if позволяет создавать простые условия типа «если, то» и имеет следующий синтаксис:

<xsl:if

test="выражение''

>

 <!--

 Содержимое: конструктор последовательности 

 -->

</xsl:if>

Выражение, содержащееся в обязательном атрибуте test, вычисляется и приводится к булевому типу. В том и только том случае, если выражение имеет значение true, процессор выполняет шаблон, содержащийся в xsl:if.

Вследствие того, что атрибуты в XML не могут содержать некоторые специальные символы (такие как "<" и "&"), их необходимо заменять символьными сущностями. Так, инструкция

<xsl:if test="a < b"/>

будет с точки зрения синтаксиса XML некорректным. Вместо нее следует использовать эквивалентную инструкцию

<xsl:if test="a &lt; b"/>.

Пример использования элемента xsl:if:

Следующая таблица стилей определяет адреса e-mail отправителей электронной почты для абонента petrov в документе message.xml:

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

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output

method="text"

encoding="Windows-1251"

indent="yes"

/>   

<xsl:template match="text()">

<xsl:apply-templates/>

</xsl:template>

<xsl:template match="to">

<xsl:if test="starts-with(@address,'petrov')">

Почта для petrov от: <xsl:value-of select="../from/@address"/>

</xsl:if>

</xsl:template>

</xsl:stylesheet>

Выходной текстовый документ будет иметь следующий вид:

Почта для petrov от: ivanov@mail.com.

5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise

Инструкция xsl:choose вместе с инструкциями xsl:when и xsl:otherwise создает более сложную конструкцию для выбора одной из нескольких имеющихся возможностей в зависимости от выполнения тех или иных условий.

Элементы xsl:choose, xsl:when и xsl:otherwise имеют следующий синтаксис:

<xsl:choose>

 <!--

 Содержимое: один или более элемент xsl:when,

 необязательный элемент xsl:otherwise 

 -->

</xsl:choose>

<xsl:when

 test="выражение"

>

<!--

 Содержимое: конструктор последовательности 

-->

</xsl:when>

<xsl:otherwise>

<!--

 Содержимое: конструктор последовательности 

--> 

</xsl:otherwise>

Элемент xsl:choose содержит один или несколько элементов xsl:when и необязательный элемент xsl:otherwise. При обработке xsl:choose процессор поочередно вычисляет выражения, содержащиеся в атрибутах test элементов xsl:when, приводит их к булевскому типу и выполняет содержимое первого (и только первого) элемента, тестовое выражение которого будет равно true. В случае если ни одно из тестовых выражений не равно истине и в xsl:choose присутствует xsl:otherwise, процессор выполнит содержимое этого элемента. Если же ни одно из тестовых выражений не равно истине и в xsl:choose нет элемента  xsl:otherwise, то ничего не создается.

Общая форма (скелет) альтернативного выбора с помощью инструкции  xsl:choose записывается в следующем виде:

<xsl:choose>

<xsl:when test="условие-1">

шаблон-1

</xsl:when>

<xsl:when test="условие-2">

шаблон-2

</xsl:when>

<!-- ... -->

<xsl:when test="условие-N">

шаблон-N

</xsl:when>

<xsl:otherwise>

шаблон-N+1

</xsl:otherwise>

</xsl:choose>.

5.3.12.3. Элемент xsl:for-each

Элемент xsl:for-each используется для создания в выходящем документе повторяемых частей структуры и имеет следующий синтаксис:  

<xsl:for-each

 select="выражение"

>

 <!--

 Содержимое: элементы xsl:sort,

 конструктор последовательности 

 --> 

</xsl:for-each>

Обязательный атрибут select указывает выражение, результатом вычисления которого должно быть множество узлов. Шаблон, содержащийся в xsl:for-each, будет выполнен процессором для каждого узла этого множества.

Пример использования элементов xsl:choose, xsl:when, xsl:othewise и xsl:for-each:

Следующая таблица стилей выделяет адреса e-mail отправителей электронной почты в документе message.xml для абонента petrov красным цветом и жирным шрифтом, а для остальных абонентом – темно-синим цветом:

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

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output

method="html"

encoding="Windows-1251"

indent="yes"

/>   

<xsl:template match="text()">

 <xsl:apply-templates/>

</xsl:template>

 <xsl:template match="message">

   <html>

     <head>

   <title>Выделение получателя сообщения</title>

   <style>

     .red {color:red; font-weight:bold}

     .navy {color:navy}

   </style>

 </head>

 <body>

   <xsl:for-each select="header/to">

   <p>От:

     <xsl:choose>

   <xsl:when test="starts-with(@address,'petrov')">

     <span class="red">

   <xsl:value-of select="@address"/>

 </span>

   </xsl:when>

   <xsl:otherwise>

 <span class="navy">

   <xsl:value-of select="@address"/>

 </span>

   </xsl:otherwise>

 </xsl:choose>

   </p>

</xsl:for-each>

 </body>

   </html>

 </xsl:template>

</xsl:stylesheet>.

Тело  документа HTML будет иметь следующий вид:

<p>От:
     <span class="red">petrov@mail.com</span></p>


<p>
От:
   <span class="navy">sidorov@mail.com</span></p>
,

а вывод страницы в Web-браузере:

От: petrov@mail.com

От: sidorov@mail.com.

5.3.12.4. Сортировка в XSLT

При преобразовании документа с помощью элементов xsl:for-each и xsl:apply-templates, выбранные узлы по умолчанию обрабатываются в порядке просмотра документа, который зависит от выражения, использованного в атрибуте select этих элементов.

Элементы xsl:for-each и xsl:apply-templates могут содержать один или несколько элементов xsl:sort, которые позволяют предварительно сортировать обрабатываемое множество узлов.

Элемент xsl:sort имеет следующий синтаксис:

<xsl:sort

select = "выражение"

lang = "язык"

data-type = "text" | "number" | "имя"

order = "ascending" | "descending"

collation? = "URI"

stable = "yes" | "no"

case-order = "upper-first" | "lower-first"

data-type = "text" | "number" | "имя"

>

 <!--

 Содержимое: конструктор последовательности 

--> 

</xsl:sort>

Если xsl:for-each и xsl:apply-templates содержат элементы xsl:sort, обработка множества узлов должна производиться не в порядке просмотра документа, а в порядке, который определяется ключами, вычисленными при помощи xsl:sort. Первый элемент xsl:sort, присутствующий в родительском элементе, определяет первичный ключ сортировки, второй элемент – вторичный ключ, и так далее.

Элемент xsl:sort обладает атрибутом select, значением которого является выражение, называемое также ключевым выражением. Это выражение вычисляется для каждого узла обрабатываемого множества, преобразуется в строку и затем используется как значение ключа при сортировке. По умолчанию значением этого атрибута является ".", что означает, что в качестве значения ключа для каждого узла используется его строковое значение.

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

Элемент xsl:sort может иметь следующие необязательные атрибуты, которые указывают некоторые параметры сортировки:

Атрибут order определяет порядок, в котором узлы должны сортироваться по своим ключам. Этот атрибут может принимать только два значения – "ascending", указывающее на восходящий порядок сортировки, и "descending", указывающее на нисходящий порядок (по умолчанию сортировка выполняется в восходящем порядке).

Атрибут lang определяет язык ключей сортировки (этот атрибут может иметь те же самые значения, что и атрибут xml:lang, например: "en", "en-us", "ru" и т. д.). Если значение этого атрибута не определено, процессор может либо определять язык исходя из параметров системы, либо сортировать строки исходя из порядка кодов символов Unicode.

Атрибут data-type определяет тип данных, который несут строковые значения ключей. Значение "text" (это значение по умолчанию) определяет, что ключи должны быть отсортированы в лексикографическом порядке исходя из языка, определенного атрибутом lang или параметрами системы. Значение "number" определяет, что  ключи должны сравниваться в численном виде (если строковое значение ключа не является числом, оно будет преобразовано к не-числу – NaN, и, поскольку нечисловые значения неупорядочены, соответствующий узел может появиться в отсортированном множестве где угодно). Значение "имя" тип данных, который определяется конкретным процессором XSLT (например, сортировка дат).

Атрибут case-order указывает на порядок сортировки символов разных регистров. Если значение атрибута равно "upper-first", то заглавные символы должны идти первыми, если "lower-first" – первыми должны идти строчные символы. Значение этого атрибута по умолчанию зависит от процессора и языка сортировки. В большинстве случаев заглавные буквы идут первыми.

Атрибут stable задает ("yes") или отменяет ("no")  спецификацию ключа сортировки для первого сортируемого элемента. По умолчанию значение этого атрибута равно "yes".

Атрибут collation задает ссылку на ресурс, содержащий правила сравнения строк.

Пример использования элемента xsl:sort:

Приведенный выше список 

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

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output

   method="text"

   encoding="Windows-1251"

   indent="yes"

 />   

 <xsl:template match="text()">

   <xsl:apply-templates/>

 </xsl:template>

 <xsl:template match="message">

   <xsl:for-each select="//to">

     <xsl:sort select="." order="descending"/>

     <xsl:value-of select="position()"/>

     <xsl:text>. </xsl:text>

     <xsl:value-of select="@address"/>

     <xsl:text>&#xA;</xsl:text>

   </xsl:for-each>

 </xsl:template>

</xsl:stylesheet>.

Выходной текстовый документ будет иметь следующий вид:

1. sidorov@mail.com

2. petrov@mail.com.

5.3.13. Сообщения процессора XSLT

Процессор XSLT сам выбирает, как и в какой последовательности он будет выполнять правила шаблона. Для получения информации о ходе преобразования, особенно при сложном преобразовании документов, а также прерывании обработки при возникновении ошибочных ситуаций можно использовать элемент xsl:message, который имеет следующий синтаксис:

<xsl:message

 select = "выражение"

 terminate="yes" | "no"

>

<!--

 Содержимое: конструктор последовательности 

--> 

</xsl:message>

Элемент xsl:message указывает процессору на то, что он должен вывести сообщение, которое является результатом обработки шаблона, содержащегося в этом элементе.

Необязательный атрибут select задает выражение XPath, результат вычисления которого выводится в начале сообщения. Альтернативным способом является задание сообщения с помощью конструктора в содержимом элемента xsl:message.

Необязательный атрибут terminate указывает на то, должен ли процессор прекратить дальнейшую обработку документа или нет (значением этого атрибута по умолчанию является "no").

Пример использования элемента xsl:message:

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

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output

method="text"

encoding="Windows-1251"

indent="yes"

 />   

 <xsl:template match="text()">

   <xsl:apply-templates/>

 </xsl:template>

 <xsl:template match="header">

   От: <xsl:value-of select="./to/@address"/>

   <xsl:message>

 <xsl:text>Processing element </xsl:text>

 <xsl:value-of select="name()"/>

 <xsl:text>[</xsl:text>

 <xsl:value-of

       select="count(preceding-sibling::header)+1"/>

 <xsl:text>]/to[</xsl:text>

 <xsl:value-of

  select="count(preceding-sibling::to)+1"/>

 <xsl:text>]</xsl:text>

   </xsl:message>

 </xsl:template>

</xsl:stylesheet>

Выходной текстовый документ будет иметь следующий вид:

От: petrov@mail.com 

От: sidorov@mail.com,

а процессор XSLT выдаст следующие сообщения:

Processing element header[1]/to[1]

Processing element header[2]/to[1].

5.3.14. Псевдонимы пространства имен в XSLT 

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

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

Проблему состоит в том, что в преобразовании необходимо использовать элементы одного пространства имен так, как если бы они относились к другому пространству.

Для решения этой проблемы в XSLT введен элемент xsl:namespace-alias, который имеет следующий синтаксис:

<xsl:namespace-alias

stylesheet-prefix="префикс" | "#default" 

result-prefix="префикс" | "#default"

/>

Элемент xsl:namespace-alias назначает пространству имен выходящего документа пространство имен, которое будет подменять его в преобразовании, т.е. псевдоним пространства имен.

Обязательный атрибут result-prefix указывает, какому пространству имен назначается псевдоним. Обязательный атрибут stylesheet-prefix указывает, какое пространство имен будет использоваться в качестве его псевдонима в преобразовании. Оба атрибута содержат префиксы пространств имен, которые должны быть ранее объявлены в преобразовании.

Атрибуты stylesheet-prefix и result-prefix элемента xsl:namespace-alias могут иметь значения "#default", например, определение вида

<xsl:namespace-alias

stylesheet-prefix="a"

result-prefix="#default"/>

означает, что элементы, принадлежащие в преобразовании пространству имен a, в выходящем документе должны принадлежать пространству имен по умолчанию.

Определение вида

<xsl:namespace-alias

stylesheet-prefix="#default"

result-prefix="a"/>

означает, что элементы, принадлежащие в преобразовании пространству имен по умолчанию, в выходящем документе должны принадлежать пространству имен a.

Пример использования элемента xsl:namespace-alias:

Документ XML, описывающий преобразование атрибута address в текстовое содержимое элементов from и to имеет следующий вид:

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

<?xml-stylesheet type="text/xsl" href="transform.xsl"?>

<transform>

<convert select="from" to-text="address"/>

<convert select="to" to-text="address"/>

</transform>.

Документ XSLT, преобразующий этот документ в набор шаблонных правил для выполнения требуемой обработки документа message.xml имеет следующий вид:

<xsl:stylesheet

  version="1.0"

  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xmlns:axsl="http://www.w3.org/1999/XSL/Transform/Alias">

 <xsl:output

 method="xml"

  encoding="Windows-1251"

  indent="yes"/>

<xsl:namespace-alias

 stylesheet-prefix="axsl"

  result-prefix="xsl"/>

<xsl:template match="convert">

  <axsl:template match="{@select}">

    <axsl:element name="{@select}">

      <axsl:for-each select="@*">   

    <axsl:if test="name(.) != 'address'">

              <axsl:attribute name="{{name()}}">

                <axsl:value-of select="."/>

            </axsl:attribute>

            </axsl:if>

  </axsl:for-each>

  <axsl:value-of select="@{@to-text}"/>

    </axsl:element>

  </axsl:template>

</xsl:template>

<xsl:template match="transform">

  <axsl:stylesheet version="1.0">

    <axsl:output method="xml"

      encoding="Windows-1251" indent="yes"/>

  <xsl:apply-templates/>

    <axsl:template match="@*|node()">

      <axsl:copy>

        <axsl:apply-templates

              select="@*|node()"/>

      </axsl:copy>

    </axsl:template>

  </axsl:stylesheet>

 </xsl:template>

</xsl:stylesheet>.

Выходной документ – документ XSLT для выполнения требуемых преобразований в message.xml имеет следующий вид:

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

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

  <axsl:output method="xml" encoding="Windows-1251" indent="yes"/>

  <axsl:template match="from">

     <axsl:element name="from">

       <xsl:for-each select="@*">

<xsl:if test="name(.) != 'address'">

 <xsl:attribute name="{name()}">

             <xsl:value-of select="." />

 </xsl:attribute>

         </xsl:if>

       </xsl:for-each>

   <axsl:value-of select="@address"/>

     </axsl:element>

  </axsl:template>

  <axsl:template match="to">

     <axsl:element name="to">

        <xsl:for-each select="@*">

<xsl:if test="name(.) != 'address'">

 <xsl:attribute name="{name()}">

             <xsl:value-of select="." />

 </xsl:attribute>

         </xsl:if>

       </xsl:for-each>>

       <axsl:value-of select="@address"/>

     </axsl:element>

  </axsl:template>

  <axsl:template match="@*|node()">

     <axsl:copy>

        <axsl:apply-templates select="@*|node()"/>

     </axsl:copy>

  </axsl:template>

</axsl:stylesheet>.

После выполнения преобразований с помощью сгенерированных правил документ message.xml преобразуется в следующий документ XML:

<message>

  <header>

     <from image="greeting">ivanov@mail.com</from>

     <to>petrov@mail.com</to>

     <subject>Поздравление</subject>

  </header>

  <body>Поздравляю с днем рождения!</body>

  <header>

     <from>ivanov@mail.com</from>

     <to>sidorov@mail.com</to>

     <subject>Напоминание</subject>

  </header>

  <body>Встречаемся в 10.00.</body>

</message>.

5.3.15. Нумерация в XSLT

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

Для вычисления порядковых номеров узлов в дереве в XSLT существует несколько способов. В простых случаях для достижения цели бывает достаточно воспользоваться одним из следующих выражений XPath:

Для того чтобы получить порядковый номер текущего узла в обрабатываемом множестве, можно использовать функцию position.

Функция count(preceding-sibling::*)+l возвращает порядковый номер (начиная c 1) текущего элемента среди других элементов его родителя (путь выборки preceding-sibling::* выбирает множество братских элементов, предшествующих текущему узлу, а функция count   вычисляет   их   количество);   

Для того чтобы учитывать при подсчете только определенные элементы, можно переписать предыдущее выражение в чуть более строгом виде (например, выражение, считающее только элементы chapter, будет задаваться следующим образом: (preceding-sibling::header)+1);

Глубина текущего узла от корня дерева может быть вычислена с помощью выражения count(ancestor-or-self::node()) (это выражение будет возвращать 1 для корневого узла, 2 для элемента документа и так далее).

Вычисление выражений и вывод вычисленных значений в результирующее дерево выполняется при помощи элемента xsl:value-of, например:

<xsl:value-of

select="count(preceding-sibling::header)+1"/>.

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

Другим, более легким и удобным способом нумерации и индексирования узлов является использование элемента xsl:number. Этот элемент имеет следующий синтаксис:

<xsl:number

value="выражение"

select="выражение"

level="single" | "multiple" | "any" 

count="выражение"

from="выражение"

format="строка"

lang="имя"

letter-value="alphabetic" | "traditional"

ordinal="строка"  

grouping-separator="символ"

 grouping-size="число"

/>

Элемент xsl:number вычисляет номер узла в соответствии с заданными критериями, форматирует его и затем вставляет в результирующее дерево в виде текстового узла. Ни один из атрибутов этого элемента не является обязательным.

Атрибут value содержит выражение, которое обрабатывается, а полученный объект преобразуется в число, как при вызове функции XPath number(). Затем это число округляется до целого и преобразуется в строку с учетом атрибутов format, lang, letter-value, grouping-separator и grouping-size (если они заданы). После преобразования полученная строка подставляется в конечное дерево.

 

Пример использования атрибута value в элементе xsl:number:

Пусть задано следующее шаблонное правило для вывода тем сообщений в документе message.xml:

<xsl:template match="subject" mode="value">

     <p>

<xsl:number value="position()"/>

    <xsl:text>. </xsl:text>

<xsl:value-of select="."/>

     </p>

</xsl:template>.

Тогда при выполнении шаблонного правила:

<xsl:template match="/">

<xsl:apply-templates

select="//header" mode="value"/>

</xsl:template>

будет выведено:

3. Поздравление

3. Напоминание.

Если атрибут value не указан, элемент xsl:number расставляет числа в зависимости от позиции текущего узла в исходном дереве. Так, если в приведенном примере в элементе xsl:number удалить атрибут value, то значения номера для всех тем будет равно 1.

Атрибуты level, count и from показывают, как будет нумероваться текущий узел.

Атрибут count содержит образец, которому должны удовлетворять нумеруемые узлы. Узлы, не соответствующие этому образцу, просто не будут приниматься в расчет. Значением этого атрибута по умолчанию является образец, выбирающий узлы с тем же типом и именем, что и у текущего узла (если, у него есть имя). Так, если в приведенном примере в элементе xsl:number заменить атрибут value атрибутом count="header", то список тем примет следующий вид:

1. Поздравление

2. Напоминание.

Атрибут from содержит образец, который определяет так называемую область нумерации, или область подсчета. При вычислении номера будут приниматься во внимание только те нумеруемые узлы, которые принадлежат этой области. По умолчанию областью подсчета является весь документ. Если в приведенном примере задать элемент   xsl:number в следующем виде:

<xsl:number  from="header[position()=1]"/>,

то список тем примет следующий вид:

1. Поздравление

. Напоминание.

Вторая тема не будет иметь номера, поскольку  область нумерации включает только первый заголовок.

Атрибут level имеет три варианта значений: single, multiple и any, значением по умолчанию является single. Процедура вычисления номеров существенным образом зависит от того, какой из этих вариантов используется: при методе single считаются элементы на одном уровне, при методе multiple – на  нескольких уровнях и при методе any – на любых уровнях дерева.

Пример использования атрибута level в элементе xsl:number:

Пусть задано следующее шаблонное правило для вывода адресатов сообщений в документе message.xml:

<xsl:template match="to" mode="level-multiple">

     <p>

<xsl:number count="header | to" level="multiple"/>

    <xsl:text>. </xsl:text>

<xsl:value-of select="@address"/>

     </p>

</xsl:template>.

Тогда при выполнении шаблонного правила:

<xsl:template match="/">

<xsl:apply-templates

     select="//header/to" mode="level-multiple"/>

</xsl:template>

будет выведено:

1.1. petrov@mail.com

2.1. sidorov@mail.com.

Если же в этом примере заменить значение атрибута level на any, то вывод изменится следующим образом:

2. petrov@mail.com

4. sidorov@mail.com.

Атрибут lang задает язык нумерации и его значения – те же, что и для атрибута xml:lang, например, lang="ru".

Значение строки формата в атрибуте format может состоять из имеющих специальное значение алфавитно-цифровых символов 1, A, a, I и i, а также из любых других символов. Символ 1 обозначает нумерацию арабскими буквами, символы A и a – нумерацию большими и маленькими латинскими буквами, а символы I и i – нумерацию   большими и маленькими римскими цифрами. Все остальные символы передаются в выводимую строку без изменения. Так, если для выводимых номеров тем задать следующий элемент:

<xsl:number count="header" format="01). "/>,

то список тем сообщений будет выведен в такой форме:

01). Поздравление

02). Напоминание.

Для нумерации большими и малыми русскими буквами необходимо задавать алфавитно-цифровой символ в виде ссылок на сущности: "&#х410;" (русская заглавная буква "A") и "&#х430;" (русская строчная буква "а"). Например, задание значения атрибута в виде "&#x430;) " приведет к выводу сообщений в следующей форме:

а) Поздравление

б) Напоминание.

Атрибут letter-value устраняет неясности в последовательностях нумерации, использующих буквы. Во многих языках обычно используются две основные последовательности нумерации, использующие буквы. В одной из них нумерация производится буквенными значениями в алфавитном порядке, в другой же числовое значение каждому пункту назначается по-другому, так как это принято для данного языка. В английском языке это будет соответствовать последовательностям нумерации, задаваемым лексемами форматирования a и i. В некоторых языках первый член обеих последовательностей одинаков, а потому одной лексемы форматирования будет недостаточно. Значение "alphabetic" указывает алфавитную последовательность, значение "traditional" – альтернативную. Если атрибут letter-value не указан, порядок разрешения любых неоднозначностей определяется реализацией. Этим атрибутом надо пользоваться осторожно, поскольку в разных процессорах он реализуется по-разному.

При использовании цифровых форматов нумерации (иными словами, строк вида 1, 01, 001 и так далее) цифры в номере можно разделить на группы, получив, например, такие номера как "2.00.00" из 20000 или "0-0-0-2" из 2. Для этой цели в xsl:number используется пара атрибутов grouping-separator и grouping-size.

Атрибут grouping-separator задает символ, который следует использовать для разбивки номера на группы цифр, в то время как grouping-size указывает размер группы. Эти атрибуты всегда должны быть вместе: если хотя бы один из них опущен, второй просто игнорируется.

Если задать элемент   xsl:number в следующем виде:

<xsl:number count="header" format="000000001)"

grouping-separator=":" grouping-size="2"/>,

то список тем примет следующий вид:

0:00:00:00:01)Поздравление

0:00:00:00:02)Напоминание.

Атрибут ordinal задает строку, которая будет использоваться как окончания в порядковых числительных, например, для английского языка 1st, 2nd, 3rd, 4th, . Допустимые окончания порядковых задаются в значении атрибута в виде списка, элементы которого отделяются друг от друга пробелами, причем каждый элемент начинается с символа "~", например, "~ый ~ой ~ий ~ая ~ое ~ые ". Реализация процессора XSLT может обеспечивать правильную подстановку окончаний порядковых числительных с учетом значений атрибутов lang и format. Если процессор такой возможности не обеспечивает, вместо порядковых выводятся количественные числительные.

Файл: file:///web/1/5fan/public_html/www/files/13/5fan_ru_69061_ffe80d9cbac59ea396b6a546cefd05db.doc   Создан: 2008-03-16T09:19:00Z Модифицирован: 2008-03-16T09:19:00Z     Автор:


 

А также другие работы, которые могут Вас заинтересовать

54953. Становление парламентаризма в России 58.5 KB
  Оборудование: Оформление помещения для проведения Парламентского урока государственными символами Российской Федерации Технические средства: мультимедиа-проектор. Мы живём с вами в одной из прекраснейших республик...
54954. Строчная буква в. Написание строчной буквы в 1.9 MB
  Задачи: Закреплять графические навыки письма изученных букв и гигиенические навыки при письме; Развивать внимание, речевые умения, умение анализировать и обобщать; Воспитывать чувство взаимопомощи, умение радоваться не только за себя, но и за своих товарищей.
54955. Описание действий (развитие речи) 30.5 KB
  Сегодня мы с вами познакомимся с новым видом сочинения-описания действий. Слов какой части речи больше в тексте описания действий глаголов. В каких случаях мы с вами чаще всего сталкиваемся с описанием действий рецепты инструкции по применению разных товаров.
54956. Инфляция: сущность, причины, виды. Методы измерения инфляции 20.97 KB
  Инфляция представляет собой увеличение денежной массы по сравнению с ее товарным покрытием и проявляется в обесценивании денег и росте общего уровня цен.
54957. Гуситское движение в Чехии 62.5 KB
  Вооруженная борьба гуситов. Крестовые походы против гуситов. Вооружение и способы борьбы гуситов. Вооруженная борьба гуситов.
54958. Причины и социально-экономические последствия инфляции. Антиинфляционная политика государства 18.02 KB
  Как свидетельствует опыт, остановить инфляцию с помощью одних организационных мер весьма трудно, если не сказать невозможно. Для этого необходима структурная реформа, направленная на преодоление возникших в экономике диспропорций.
54959. Пусть всегда будет солнце 62.5 KB
  Вид урока Комбинированный Тип урока Комплексный урок Государственный социальный заказ Во исполнение Закона Российской Федерации Об образовании; Закона О развитии образования в городе Москве; Конвенции о правах ребенка;...
54960. ВЫРЕЗАНИЕ ИЗ БУМАГИ 69 KB
  Цели: Обучающая: Способствовать формированию представления о таком виде декоративно прикладного искусства как вырезание из бумаги. Слайды 18 Сейчас вы можете назвать мне тему нашего урока ответы детей Правильно вырезание из бумаги слайд 9 Но давайте нашему уроку придумаем красивое название...