Язык преобразований XSL

Атрибуты преобразования числа в строку

.
Главным атрибутом является format. По умолчанию атрибут format имеет значение 1. Атрибут format разбивается на последовательность лексем, каждая из которых представляет собой максимальную последовательность alphanumeric символов или максимальную последовательность символов, не являющихся alphanumeric. Alphanumeric здесь означает любой символ, который имеет категорию Unicode Nd, Nl, No, Lu, Ll, Lt, Lm или Lo. Alphanumeric лексемы (лексемы формата) определяют формат, которым должен использоваться для каждого числа в списке. Если первая лексема является не alphanumeric, создаваемая строка начнется с этой лексемы. Если последняя лексема является не alphanumeric, создаваемая строка закончится этой лексемой. Не-alphanumeric лексемы, оказавшиеся между двумя лексемами форматирования, являются разделителями лексем, которые должны использоваться в списке для объединения чисел. n-ая лексема форматирования будет использоваться в списке для форматирования n-го числа. Если чисел больше чем лексем форматирования, для форматирования оставшихся чисел будет использоваться последняя лексема форматирования. Если лексемы форматирования отсутствуют, для форматирования всех чисел должна использоваться лексема форматирования 1. Эта лексема форматирования указывает строку, которая должна использоваться для представления числа 1. Каждое число, начиная со второго, будет отделено от предыдущего числа либо лексемой разделителя, которая предшествует лексеме форматирования, использованной для форматирования этого числа, либо, если лексемы разделителя отсутствуют, символом точки (.).
Лексемы форматирования включают как подмножество разрешенные значения атрибута type в элементе OL из HTML 4.0 и интерпретируются следующим образом:
Любая лексема, где последний символ имеет значение десятичной цифры 1 (указанное в базе данных по свойствам символов Unicode), а значение Unicode предшествующих символов меньше чем значение Unicode последнего символа, генерирует такое десятичное представление числа, что любое число будет не короче лексемы форматирования.
Так, лексема форматирования 1 генерирует последовательность 1 2 ... 10 11 12 ..., а лексема форматирования 01 дает последовательность 01 02 ... 09 10 11 12 ... 99 100 101.

Лексема форматирования A генерирует последовательность A B C ... Z AA AB AC....

Лексема форматирования a генерирует последовательность a b c ... z aa ab ac....

Лексема форматирования i генерирует последовательность i ii iii iv v vi vii viii ix x ....

Лексема форматирования I генерирует последовательность I II III IV V VI VII VIII IX X ....

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

Если нумерация выполняется последовательностью букв, атрибут lang указывает, алфавит какого языка следует использовать. Атрибут имеет тот же самый диапазон значений, что и xml:lang в . Если значение lang не было указано, язык следует определить из системного окружения. Разработчикам процессоров следует документировать, для каких языков поддерживается нумерация.

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

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


Значение alphabetic указывает алфавитную последовательность, значение traditional - альтернативную. Если атрибут letter-value не указан, порядок разрешения любых неоднозначностей определяется реализацией.

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

Атрибут grouping-separator определяет разделитель для группировки в десятичной нумерации (например, тысяч). Необязательный атрибут grouping-size указывает размер для группировки (обычно, 3). Например, grouping-separator="," и grouping-size="3" должны определить числа в формате 1,000,000. Если указан только один из атрибутов grouping-separator или grouping-size, он игнорируется.

Некоторые примеры спецификаций преобразования:

format="ア" задает нумерацию Katakana

format="イ" задает нумерацию Katakana в последовательности "iroha"

format="๑" задает нумерацию тайскими цифрами

format="א" letter-value="traditional" задает "традиционную" еврейскую нумерацию

format="ა" letter-value="traditional" задает григорианскую нумерацию

format="α" letter-value="traditional" задает "классическую" греческую нумерацию

format="а" letter-value="traditional" задает старославянскую нумерацию



B Справочник синтаксиса элементов






<

select = node-set-expression

mode = qname>






<

name = { qname }
namespace = { uri-reference }>






<

name = qname

use-attribute-sets = qnames>






<

name = qname>






<>






<>






<

use-attribute-sets = qnames>






<

select = expression />


<

name = qname

decimal-separator = char

grouping-separator = char

infinity = string

minus-sign = char

NaN = string

percent = char

per-mille = char

zero-digit = char

digit = char

pattern-separator = char />


<

name = { qname }

namespace = { uri-reference }

use-attribute-sets = qnames>






<>






<

select = node-set-expression>







<

test = boolean-expression>





<

href = uri-reference />



<

href = uri-reference />



<

name = qname

match = pattern

use = expression />



<

terminate = "yes" | "no">







<

stylesheet-prefix = prefix | "#default"

result-prefix = prefix | "#default" />



<

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

count = pattern

from = pattern

value = number-expression

format = { string }

lang = { nmtoken }

letter-value = { "alphabetic" | "traditional" }

grouping-separator = { char }

grouping-size = { number } />

<>







<

method = "xml" | "html" | "text" | qname-but-not-ncname

version = nmtoken
encoding = string

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

standalone = "yes" | "no"

doctype-public = string

doctype-system = string

cdata-section-elements = qnames

indent = "yes" | "no"

media-type = string />




<

name = qname

select = expression>







<

elements = tokens />



<

name = { ncname }>





<

select = string-expression

lang = { nmtoken }

data-type = { "text" | "number" | qname-but-not-ncname }

order = { "ascending" | "descending" }

case-order = { "upper-first" | "lower-first" } />



<

elements = tokens />

<

id = id

extension-element-prefixes = tokens

exclude-result-prefixes = tokens

version = number>






match = pattern
name = qname
priority = number
mode = qname>





<

disable-output-escaping = "yes" | "no">





<

id = id

extension-element-prefixes = tokens

exclude-result-prefixes = tokens

version = number>








select = string-expression

disable-output-escaping = "yes" | "no" />





<

name = qname

select = expression>





<

test = boolean-expression>





<

name = qname

select = expression>





Базовый URI

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

C Фрагмент DTD для стилей XSLT (пояснения к спецификации)

Замечание: Данный фрагмент DTD не является нормативным, поскольку в XML 1.0 DTD не поддерживают пространства имен XML, а потому не могут корректно описывать структуру, допустимую для стиля XSLT.
Приводимая далее сущность может использоваться при создании DTD для XSLT стилей, который создает экземпляры уже конкретного конечного DTD. Прежде чем ссылаться на сущность, стиль DTD должен определить сущность параметра result-elements, дающего перечень разрешенных типов данного конечного элемента. Например,

Должно быть декларировано, что такие конечное элементы имеют атрибуты xsl:use-attribute-sets и xsl:extension-element-prefixes. Для этой цели приводимая далее сущность декларирует параметр result-element-atts. XSLT позволяет конечным элементам иметь то же самое содержимое, которое допускалось для элементов XSLT, декларированных в следующей сущности с моделью содержимого %template;. DTD может использовать более ограничивающую модель содержимого, чем %template; чтобы отразить ограничения в конечном DTD.
DTD может определить сущность параметра non-xsl-top-level с тем, чтобы разрешить использование дополнительных элементов верхнего уровня из других пространств имен, помимо пространства имен XSLT.
Использование префикса xsl: в этом DTD не означает, что стили XSLT обязаны использовать этот префикс. Любой из элементов, декларированных в этом DTD, в дополнение к атрибутам, декларированным в этом же DTD, может иметь атрибуты, имена которых начинаются с xmlns: или равны xmlns.




Замечание: Данный фрагмент DTD не является нормативным, поскольку в XML 1.0 DTD не поддерживают пространства имен XML, а потому не могут корректно описывать структуру, допустимую для стиля XSLT.
Приводимая далее сущность может использоваться при создании DTD для XSLT стилей, который создает экземпляры уже конкретного конечного DTD. Прежде чем ссылаться на сущность, стиль DTD должен определить сущность параметра result-elements, дающего перечень разрешенных типов данного конечного элемента. Например,
Должно быть декларировано, что такие конечное элементы имеют атрибуты xsl:use-attribute-sets и xsl:extension-element-prefixes. Для этой цели приводимая далее сущность декларирует параметр result-element-atts. XSLT позволяет конечным элементам иметь то же самое содержимое, которое допускалось для элементов XSLT, декларированных в следующей сущности с моделью содержимого %template;. DTD может использовать более ограничивающую модель содержимого, чем %template; чтобы отразить ограничения в конечном DTD.
DTD может определить сущность параметра non-xsl-top-level с тем, чтобы разрешить использование дополнительных элементов верхнего уровня из других пространств имен, помимо пространства имен XSLT.
Использование префикса xsl: в этом DTD не означает, что стили XSLT обязаны использовать этот префикс. Любой из элементов, декларированных в этом DTD, в дополнение к атрибутам, декларированным в этом же DTD, может иметь атрибуты, имена которых начинаются с xmlns: или равны xmlns.











































































































































































































D.1 Пример документа

В данном примере представлен стиль для преобразования документа, соответствующего простому DTD, в XHTML . Содержимое DTD:

Содержимое стиля:


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






NOTE:



Со следующим входным документом
Document Title Chapter Title

Section Title This is a test. This is a note.
Another Section Title This is another test. This is another note.

стиль должен дать следующий результат

Document Title

Document Title

Chapter Title

Section Title

This is a test.

NOTE: This is a note.

Another Section Title

This is another test.

NOTE: This is another note.


D.2 Пример данных

Для неких данных, представленных в формате XML, данный пример показывает преобразование с помощью трех различных стилей XSLT чтобы получить три различных представления этих данных в форматах HTML, SVG и VRML.
Входные данные:

10 9 7
4 3
4

6 -1.5 2

Далее приводится стиль, который, используя упрощенный синтаксис, описанный в главе , преобразует эти данные в формат HTML:
Sales Results By Division
Division Revenue Growth Bonus
color:red


Полученный HTML документ:

Sales Results By Division
DivisionRevenueGrowthBonus
North1097
West6-1.52
South434


Следующий стиль преобразует данные в SVG:







Revenue Division














Полученный SVG документ:

Revenue Division North 10 South 4 West 6

Следующий стиль преобразует данные в VRML:






#VRML V2.0 utf8

# externproto definition of a single bar element EXTERNPROTO bar [ field SFInt32 x field SFInt32 y field SFInt32 z field SFString name ] "http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl"

# inline containing the graph axes Inline { url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl" }

bar { x y z name "" }





Полученный VRML документ:

#VRML V2.0 utf8

# externproto definition of a single bar element EXTERNPROTO bar [ field SFInt32 x field SFInt32 y field SFInt32 z field SFString name ] "http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl"

# inline containing the graph axes Inline { url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl" }

bar { x 10 y 9 z 7 name "North" } bar { x 4

y 3 z 4 name "South" }

bar { x 6

y -1.5 z 2 name "West" }

Дополнительные функции

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

E Благодарности (пояснения к спецификации)

В разработку предварительного варианта документа вклад внести следующие лица:
  • Daniel Lipkin, Saba
  • Jonathan Marsh, Microsoft
  • Henry Thompson, Университет Эдинбурга
  • Norman Walsh, Arbortext
  • Steve Zilles, Adobe

  • Данная спецификация была разработана и одобрена для публикации рабочей группой по XSL из W3C. То что рабочая группа одобрила эту спецификацию, не обязательно означает, что ее одобрили все члены группы. В настоящее время членами рабочей группы по XSL являются:
    Sharon Adler, IBM (сопредседатель); Anders Berglund, IBM; Perin Blanchard, Novell; Scott Boag, Lotus; Larry Cable, Sun; Jeff Caruso, Bitstream; James Clark; Peter Danielsen, Bell Labs; Don Day, IBM; Stephen Deach, Adobe; Dwayne Dicks, SoftQuad; Andrew Greene, Bitstream; Paul Grosso, Arbortext; Eduardo Gutentag, Sun; Juliane Harbarth, Software AG; Mickey Kimchi, Enigma; Chris Lilley, W3C; Chris Maden, Exemplary Technologies; Jonathan Marsh, Microsoft; Alex Milowski, Lexica; Steve Muench, Oracle; Scott Parnell, Xerox; Vincent Quint, W3C; Dan Rapp, Novell; Gregg Reynolds, Datalogics; Jonathan Robie, Software AG; Mark Scardina, Oracle; Henry Thompson, University of Edinburgh; Philip Wadler, Bell Labs; Norman Walsh, Arbortext; Sanjiva Weerawarana, IBM; Steve Zilles, Adobe (сопредседатель)

    F Изменения по внесенным рекомендациям (пояснения к спецификации)

    После вынесения предложенной Рекомендации на обсуждение были приняты следующие изменения:
    В фиксированном конечном элементе, используемом в качестве стиля, обязательным является атрибут xsl:version (см. ).
    Атрибут data-type в xsl:sort может использовать префиксное имя для того, чтобы указывать тип данных, не определенный в XSLT (см. главу ).


    Фиксированные конечные элементы

    В шаблоне элемент из стиля, который не принадлежит пространству имен XSLT и не является элементом расширения (см. ), обрабатывается, чтобы создать узел элемента с тем же . Содержимое этого элемента является шаблоном, который обрабатывается чтобы получить содержимое для созданного узла элемента. Узел созданного элемента будет иметь те узлы атрибутов, которые были представлены в дереве стиля в узле данного элемента, а не атрибутов с названиями из пространства имен XSLT.
    Созданный узел элемента будет также иметь копию узлов для пространства имен, которые присутствовали в узле элемента в дереве стиля, за исключением тех узлов пространства имен, чьим строковым значением является URI пространства имен XSLT (http://www.w3.org/1999/XSL/Transform), URI пространства имен, декларированного как пространство расширения (см. ), или URI пространства имен, обозначенного как исключенное. URI пространства имен обозначается как исключенное с помощью атрибута exclude-result-prefixes в элементе xsl:stylesheet или атрибута xsl:exclude-result-prefixes в фиксированном конечном элементе. Значением обоих этих атрибутов является перечень префиксов пространства имен, разделенных пробельным символом. Пространство имен, связанное с каждым из этих префиксов, обозначается как исключенное. Если с префиксом элемента, имеющего атрибут exclude-result-prefixes или xsl:exclude-result-prefixes, не связано никакого пространства имен, фиксируется ошибка. Пространство имен по умолчанию, декларированное с помощью xmlns, может быть обозначено как исключенное если в соответствующий список префиксов пространства имен включить #default. Объявление пространства имен в качестве исключенного действует в том поддереве стиля, которое начинается с элемента, имеющего данный атрибут exclude-result-prefixes или xsl:exclude-result-prefixes. Поддерево, начинающееся с элемента xsl:stylesheet, не включает стили, импортированные или включенные непосредственным потомком этого элемента xsl:stylesheet.
    Замечание: Если стиль использует декларацию пространства имен только для адресации в исходном дереве, то указание этого префикса в атрибуте exclude-result-prefixes позволит избежать появления в конечном дереве ненужных деклараций пространства имен.

    Значение атрибута в фиксированном конечном элементе интерпретируется как : он может содержать выражения, заключенные в фигурные скобки ({}).

    URI пространства имен в дереве стиля, которое используется для определения URI пространства имен в конечном дереве, называется фиксированным URI пространства имен. Это относится к:

    URI пространства имен в расширенном имени фиксированного конечного элемента в этом стиле

    URI пространства имен в расширенном имени атрибута, указанного в фиксированном конечном элементе в стиле

    строковому значению узла пространства имен в фиксированном конечном элементе в стиле


    stylesheet-prefix =

    prefix | "#default"
    result-prefix = prefix | "#default" />

    Чтобы декларировать, что один URI пространства имен является синонимом другого URI пространства имен, в стиле может использоваться элемент xsl:namespace-alias. Если был декларирован как синоним другого URI пространства имен, то в конечном дереве URI пространства имен будет представлен не этим фиксированным URI пространства имен, а тем URI пространства имен, для которого он является синонимом. Элемент xsl:namespace-alias декларирует, что URI пространства имен, связанный с префиксом, задаваемым атрибутом stylesheet-prefix, является синонимом для URI пространства имен, связанного с префиксом, задаваемым атрибутом result-prefix. Таким образом, атрибут stylesheet-prefix указывает URI пространства имен, который будет представлен в стиле, а атрибут result-prefix задает соответствующий URI пространства имен, который будет представлен в конечном дереве. Пространство имен по умолчанию (декларируемое с помощью xmlns) может быть задано не префиксом, а с помощью #default. Если некое URI пространства имен декларировано как синоним сразу для нескольких различных URI пространства имен, то используется декларация с наивысшим . Если и таких деклараций будет несколько, фиксируется ошибка. XSLT процессор может сигнализировать об этой ошибке, если он этого не делает, то должен обработать ошибку сам, выбрав среди деклараций с наивысшим приоритетом импорта ту, которая в стиле появилась последней.


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







    будет генерировать стиль XSLT из документа следующего вида:

    p h1 h2 h3 h4 Замечание: Синонимы могут также понадобиться для иных пространств имен, нежели URI пространства имен XSLT. Например, фиксированные конечные элементы, принадлежащие пространству имен, работающему с цифровыми подписями, могут привести к тому, что стили XSLT будут неправильно обрабатываться программами обеспечения безопасности общего назначения. Используя синоним для этого пространства имен, такую нестыковку можно устранить.

    Фиксированный конечный элемент как стиль

    Для стилей, состоящих из единственного шаблона, для корневого узла можно использовать упрощенный синтаксис. Данный стиль может содержать только один фиксированный конечный элемент (literal result element, см. главу ). Такой стиль равнозначен стилю с элементом xsl:stylesheet, содержащим правило шаблона с фиксированным конечным элементом, которое для сравнения использует образец /. Например:
    Expense Report Summary Total Amount:

    что равнозначно
    Expense Report Summary Total Amount:

    Фиксированный конечный элемент, являющийся для стиля элементом документа, должен иметь атрибут xsl:version, указывающий версию XSLT, необходимую для этого стиля. Для данной версии XSLT значением этого атрибута должно быть 1.0, значение должно иметь тип . Другие фиксированные конечные элементы также должны иметь атрибут xsl:version. Если атрибут xsl:version не равен 1.0, должен быть разрешен режим обработки, совместимый с последующими версиями. (см. главу ).
    Фиксированный конечный элемент, используемый как стиль, может иметь то же содержание, что и в случае, когда он является частью другого стиля. Таким образом, фиксированный конечный элемент, используемый как стиль, не может содержать элементов .
    В некоторых ситуациях, единственная возможность для системы узнать, что некий XML документ XSLT процессор должен обрабатывать именно как стиль XSLT - это исследовать сам представленный XML документ самостоятельно. Использование упрощенного синтаксиса усложняет эту задачу.
    Замечание: Например, другой язык XML (AXL) также может использовать в элементе документа атрибут axl:version чтобы показать, что XML документ является AXL документом, который необходимо обрабатывать AXL процессором. Если документ имеет оба указанных атрибута axl:version, становится непонятным, следует ли данный документ обрабатывать XSLT процессором или же AXL процессором.
    По этой причине упрощенный синтаксис не должен использоваться для XSLT стилей, которые могут оказаться в такой ситуации. Например, такая ситуация может возникать когда стиль XSLT передается как сообщение с типом среды MIME text/xml или application/xml, а получатель использует этот тип среды MIME чтобы определить, как следует обрабатывать это сообщение.

    Форматирование чисел

    Функция: строка format-number(число, строка, строка?)
    Функция преобразует свой первый аргумент в строку, используя строку шаблона форматирования, представленную во втором аргументе, и десятичный формат, поименованый в третьем аргументе, либо десятичный формат по умолчанию, если третий аргумент отсутствует. Строка с шаблоном форматирования имеет синтаксис, определенный в JDK 1.1 для класса . Строка шаблона форматирования представлена в локализованной нотации: десятичный формат определяет, какие именно символы в шаблоне имеют специальное значение (за исключением символа кавычки, который не подлежит локализации). Шаблон формата не должен содержать символ денежной единицы (#x00A4), такая возможность была добавлена уже после первой реализации JDK 1.1. Названием десятичного формата должно быть , которое приводится к расширенному имени как описано в главе . Если в стиле отсутствует декларация десятичного формата с заданным , фиксируется ошибка.
    Замечание: Разработчики не обязаны использовать именно реализацию JDK 1.1, а сам анализатор не обязательно реализовывать на Java.
    Замечание: Чтобы контролировать округление чисел, в стилях могут использоваться другие функции из XPath.



    name = qname

    decimal-separator = char

    grouping-separator = char

    infinity = string

    minus-sign = char

    NaN = string

    percent = char

    per-mille = char

    zero-digit = char

    digit = char

    pattern-separator = char />
    Элемент xsl:decimal-format декларирует десятичный формат, который управляет интерпретацией шаблона формата, используемого в функции . Если присутствует атрибут name, данный элемент декларирует именованный десятичный формат. В остальных случаях декларируется десятичный формат по умолчанию. Значением атрибута name является , которое приводится к расширенному имени как было описано в главе .
    Если десятичный формат по умолчанию или десятичный формат с данным именем, декларируется несколько раз, фиксируется ошибка (даже при различном ). Это можно делать только если каждый раз для всех атрибутов декларированы одни и те же значения (принимая во внимание все значения по умолчанию).

    Остальные атрибуты xsl:decimal-format соответствуют методам класса из JDK 1.1. Для каждой пары методов get/set в элементе xsl:decimal-format определен соответствующий атрибут.

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

    decimal-separator задает символ, используемый как десятичная точка, по умолчанию используется символ точки (.)

    grouping-separator задает символ, используемый как разделитель при группировке (например, тысяч), по умолчанию используется символ запятой (,)

    percent задает символ, используемый как символ процента, по умолчанию используется символ процента (%)

    per-mille задает символ, используемый как символ промилле, по умолчанию используется символ промилле из набора Unicode (#x2030)

    zero-digit задает символ, используемый как цифра нуль, по умолчанию используется цифра нуль (0)



    Следующие атрибуты задают интерпретацию символов в шаблоне формата:

    digit задает символ, используемый в шаблоне формата для обозначения цифр, по умолчанию таковым является символ решетки (#)

    pattern-separator задает символ, используемый для разделения положительной и отрицательной частей в шаблоне, по умолчанию используется символ точки с запятой (;)



    Следующие атрибуты определяют символы или строки, которые могут появиться в результате форматирования числа:

    infinity задает строку, используемую для обозначения бесконечности, по умолчанию используется строка Infinity

    NaN задает строку, используемую для представления значения NaN, по умолчанию используется строка NaN

    minus-sign задает символ, используемый по умолчанию как знак "минус", по умолчанию используется символ тире-минус (-, #x2D)



    Фрагменты конечного дерева

    Переменные привносят в язык выражений новый тип данных. Этот дополнительный тип данных называется фрагментом конечного дерева (result tree fragment). Переменная может быть привязана к фрагменту конечного дерева, а не только к одному из четырех базовых типов данных в XPath (строка, число, булево значение, набор узлов). Фрагмент конечного дерева представляет здесь именно фрагмент в конечном дереве. Фрагмент конечного дерева обрабатывается точно так же как набор узлов, который содержит только один корневой узел. Однако для фрагмента конечного дерева разрешена лишь часть операций, допустимых для набора узлов. Операцию можно использовать для фрагмента конечного дерева только когда ее можно использовать для строки (операция над строкой может включать предварительное преобразование этой строки в число или булево значение). В частности, для фрагментов конечного дерева нельзя использовать операции /, // и []. Если для фрагмента конечного дерева выполняется рпазрешенная операция, то она выполняется точно так же как если применена к эквивалентному набору узлов.
    Если в конечное дерево копируется фрагмент конечного дерева (см. ), то в конечное дерево последовательно добавляются все узлы из эквивалентного набора узлов, являющиеся непосредственными потомками корневого узла.
    Выражение может возвратить значение, имеющее тип фрагмента конечного дерева, либо ссылаясь на переменные, имеющие тип фрагмента конечного дерева, либо вызывая функции расширения, которые возвращают фрагмент конечного дерева, либо получая системное свойство, значением которых является фрагмент конечного дерева.

    Функции расширения

    Если в выражении не является (например, содержит двоеточие), то оно обрабатывается как вызов функции расширения. приводится к расширенному имени с помощью деклараций пространства имен, извлеченных из контекста обработки.
    Если XSLT процессору недоступна реализация функции расширения с указанным именем, то тогда функция в ответ на это имя должна возвращать false. Если в выражении была найдена такая функция расширения и действительно был сделан вызов этой функции расширения, то XSLT процессор должен фиксировать ошибку. Однако XSLT процессор не должен сигнализировать об ошибке только потому, что некое выражение содержит функцию расширения, для которой нет доступной реализации.
    Если реализация функции расширения с указанным именем доступна XSLT процессору, функция для этого имени должна возвращать true. Если сделан вызов такого расширения, XSLT процессор должен вызвать данную реализацию, передав ей аргументы вызова этой функции. Результат, полученный от вызова реализации, передается как результат вызова функции.

    Язык преобразований XSL

    Для версий XSLT, которые последуют за XSLT 1.0, рассматривается следующий функционал:
    выражение при условии;
    поддержка типов данных и архитипов для XML Schema;
    поддержка чего-либо похожего на правила типов в исходном представлении XSL;
    атрибут, задающий пространство имен по умолчанию для имен, используемых в атрибутах XSLT;
    поддержка ссылок на сущности;
    поддержка DTD в модели данных;
    поддержка нотаций в модели данных;
    способ обратиться в обратном направлении от элемента к тем элементам, которые на него ссылаются (например, с помощью атрибутов IDREF);
    упрощенный способ получить ID или ключ в другом документе;
    поддержка регулярных выражений, которые исключают все или что-либо из текстовых узлов, значений атрибутов, названий атрибутов, названий типов элементов;
    независимое от регистра сравнение;
    нормализация строк перед сравнением, например, для совместимости символов;
    функция строка resolve(набор узлов), которая обрабатывает значение аргумента как относительный URI и преобразует его в абсолютный URI, используя базовый URI данного узла;
    несколько конечных документов;
    используемый по умолчанию атрибут select для xsl:value-of в текущем узле;
    атрибут в xsl:attribute, позволяющий управлять нормализацией значения этого атрибута;
    дополнительные атрибуты в xsl:sort чтобы получить больший контроль над сортировкой, например, над относительным порядком скриптов;
    способ разместить в конечном дереве текст, взятый из некого ресурса, идентифицируемого с помощью URI;
    позволить объединение шагов (например, foo/(bar|baz));
    разрешить использовать для фрагментов конечного дерева все те же операции, которые разрешены для набора узлов;
    способ группировать вместе следующих друг за другом узлы, имеющие одинаковые нижележащие элементы или атрибуты;
    свойства, которые бы сделали обработку атрибута HTML style более удобной.


    H Словарь (пояснения к спецификации)

    При переводе спецификации на русский язык для ряда терминов был выбран следующий вариант перевода.
    attribute value template - именованный набор атрибутов

    child - непосредственный потомок

    conditional processing - обработка при условии

    conformance - соответствие спецификации

    context node - узел контекста

    context node list - контекстный набор узлов

    context position - положение в контексте

    document element - элемент документа

    document type declaration - декларация типа документа, DTD

    DTD subset - набор DTD (внутренний, внешний)

    element node - узел элемента

    escape character - маскировать символ

    expanded name - расширенное имя

    extension namespace - пространство имен расширений

    fallback - откат

    forward-compatible processing - обработка в режиме совместимости с последующими версиями

    literal result element - фиксированный конечный элемент

    location path - путь адресации

    named attribute set - именованный набор атрибутов

    node set - набор узлов

    parsed entity - разобранная сущность

    pattern - образец (правила шаблона)

    processing instruction - инструкция обработки

    production - сценарий (языков XML, XPath)

    qualified name - полное имя

    result tree - конечное дерево (результат выполнения преобразования)

    source tree - начальное дерево (объект преобразования)

    standalone document - одиночный документ

    stylesheet - стиль оформления

    template rule - правило шаблона

    top-level element - элемент верхнего уровня

    unparsed entity - неразобранная сущность

    value-binding element - элемент привязки переменной

    variable binding - привязка переменной контекста

    vocabulary - словарь форматирования

    well-formed - корректный

    whitespace - пробельный символ


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


    Именованные наборы атрибутов


    name = qname
    use-attribute-sets =
    qnames>


    Элемент xsl:attribute-set определяет именованный набор атрибутов. Название для этого набора атрибутов определяется атрибутом name. Значением атрибута name является , которое приводится к расширенному имени как описано в главе . Содержимое элемента xsl:attribute-set состоит из нуля или нескольких элементов xsl:attribute, которые определяют атрибуты в этом наборе.
    Чтобы использовать набор атрибутов в элементах xsl:element, xsl:copy (см. ) или xsl:attribute-set, задается атрибут use-attribute-sets. Значением атрибута use-attribute-sets является перечень названий наборов атрибутов через пробел. Каждое название указывается как , которое приводится к расширенному имени как было описано в . Указание атрибута use-attribute-sets равнозначно добавлению элементов xsl:attribute для каждого атрибута в каждом именованном наборе атрибутов в начало содержимого того элемента, где этот атрибут use-attribute-sets находится, причем в том же порядке как названия этих наборов были перечислены в атрибуте use-attribute-sets. Если в результате использования атрибутов use-attribute-sets в элементах xsl:attribute-set набор атрибутов начинает прямо или косвенно использовать сам себя, фиксируется ошибка.
    Наборы атрибутов можно также использовать, указывая в фиксированном конечном элементе атрибут xsl:use-attribute-sets. Значением атрибута xsl:use-attribute-sets является перечень названий наборов атрибутов через пробел. Использование атрибута xsl:use-attribute-sets дает тот же результат, как использование атрибута use-attribute-sets в xsl:element с тем дополнительным ограничением, что атрибуты, указанные в фиксированном конечном элементе, сами обрабатываются так, как если бы они были заданы элементами xsl:attribute прежде всех настоящих элементов xsl:attribute, но после всех элементов xsl:attribute, подставляемых атрибутом xsl:use-attribute-sets.
    Таким образом, для фиксированного конечного элемента первыми будут добавлены атрибуты из наборов, названных в атрибуте xsl:use-attribute-sets, и именно в том порядке, как они были перечислены в этом атрибуте. Затем будут добавлены атрибуты, указанные в фиксированном конечном элементе. И наконец, будут добавлены все атрибуты, заданные элементами xsl:attribute. Поскольку добавление атрибута к элементу замещает любой из уже имевшихся в этом элементе атрибутов c тем же самым названием, это означает, что атрибуты, заданные в наборах атрибутов, могут быть переопределены атрибутами, указанными в самом фиксированном конечном элементе.

    Шаблон в каждом элементе xsl:attribute из элемента xsl:attribute-set обрабатывается при каждом использовании данного набора атрибутов. При обработке используются те же самые текущий узел и текущий набор узлов, что и для обработки элемента, содержащего атрибут use-attribute-sets или xsl:use-attribute-sets. Однако у элемента xsl:attribute иное местоположение в стиле, чем у элемента, имеющего атрибут use-attribute-sets или xsl:use-attribute-sets, а это определяет, какие привязки переменных контекста будут видимы (см. ). Таким образом, видимы будут лишь переменные и параметры, декларированные элементами xsl:variable и xsl:param.

    В следующем примере сперва создается именованный набор атрибутов title-style, а затем используется в правиле шаблона.



    12pt bold

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

    Именованные шаблоны


    name = qname>


    Шаблоны можно вызывать по имени. Именованный шаблон задается элементом xsl:template с атрибутом name. Значением атрибута является имя name , которое приводится к расширенному имени как описано в главе . Если элемент xsl:template имеет атрибут name, то он может, но не обязан, иметь также атрибут match. Элемент xsl:call-template вызывает шаблон по имени, он содержит обязательный атрибут name, идентифицирующий шаблон, который должен быть вызван. В отличие от xsl:apply-templates, xsl:call-template не меняет текущий узел и текущий набор узлов.
    Атрибуты match, mode и priority в элементе xsl:template не зависят от того, был ли этот шаблон вызван элементом xsl:call-template. Точно так же атрибут nameв элементе xsl:template не зависит от того, был ли этот шаблон вызван элементом xsl:apply-templates.
    Если стиль содержит более одного шаблона с одним и тем же названием, а также одним и тем же , фиксируется ошибка.

    Импорт стилей

    href = uri-reference />
    С помощью элемента xsl:import один XSLT стиль может импортировать другой стиль XSLT. Импортирование стиля похоже на его включение (см. ) за исключением того, что определения и правила шаблона в испортирующем стиле имеют приоритет над правилами шаблона и определениями в импортируемом стиле, более детально это будет обсуждаться ниже. Элемент xsl:import имеет атрибут href, значением которого является ссылка URI, идентифицирующая импортируемый стиль. Относительная ссылка URI обрабатывается относительно базового URI элемента xsl:import (см. ).
    Элемент xsl:import можно использовать только как элемент . Потомки элемента xsl:import должны предшествовать всем другим элементам, являющимся непосредственными потомкам элемента xsl:stylesheet, в том числе и всем элементам xsl:include. Если для включения стиля используется xsl:include, то все элементы xsl:import из включаемого документа в включающем документе переносятся вверх и ставятся после всех уже имевшихся во включающем документе элементов xsl:import.
    Например,
    italic
    Элементы xsl:stylesheet, которые встречаются при обработке стиля, содержащего элементы xsl:import, обрабатываются как формирующие дерево импорта. В дереве импорта каждый элемент xsl:stylesheet имеет одного импортируемого непосредственного потомка для каждого элемента xsl:import, который он содержит. Элементы xsl:include обрабатываются до начала построения дерева импорта. Элемент xsl:stylesheet в дереве импорта по определению имеет меньший приоритет импорта чем другой элемент xsl:stylesheet в дереве импорта, если он будет посещен прежде этого элемента xsl:stylesheet при проходе дерева импорта после обработки (то есть, таком проходе дерева импорта, когда элемент xsl:stylesheet посещается после своего импортированного непосредственного потомка).
    Каждое определение и правило шаблона имеет приоритет импорта, заданный элементом xsl:stylesheet, в котором он содержится.

    Например, предположим, что

    стиль A, импортирует стили B и C в указанном порядке:

    стиль B импортирует стиль D;

    стиль C импортирует стиль E.



    Тогда порядок приоритетов импорта (начиная с наименьшего) будет D, B, E, C и A.

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

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

    Если стиль прямо или косвенно импортирует себя, фиксируется ошибка. Однако когда стиль с заданным URI импортирован сразу в нескольких местах, какой-либо специальной обработки нет. Для каждой точки, где оно было импортировано, будет иметь отдельный xsl:stylesheet.

    Замечание: Если используется xsl:apply-imports (см. главу ), то функционирование может быть иным, чем когда этот стиль был импортирован только в этом месте и с наивысшим .

    Использование правил шаблона


    select = node-set-expression
    mode = qname>


    В данном примере для элемента chapter создается блок, а затем обрабатывается его непосредственный потомок.

    В отсутствие атрибута select инструкция xsl:apply-templates обрабатывает все непосредственные потомки текущего узла, включая узлы текста. Однако те текстовые узлы, которые были вычищены как описано в главе , обрабатываться не будут. Если очистка узлов с пробельными символами для элемента не была разрешена, то все пробельные символы в содержимом этого элемента будут обрабатываться как текст, и, следовательно, пробельный символ между элементами - непосредственными потомками будет учитываться при вычислении положения элемента - непосредственного потомка, возвращаемого функцией .
    Чтобы обрабатывать не все непосредственные потомки, а лишь узлы, отобранные по некому выражению, может использоваться атрибут select. Значением атрибута select является . После обработки этого выражения должен получиться набор узлов. Если нет указаний по сортировке (см. ), собранный перечень узлов обрабатывается в том порядке, как они следуют в документе. В следующем примере обрабатываются все непосредственные потомки author для этого элемента author-group:

    В следующем примере обрабатываются все содержащиеся в author элементы given-name, которые являются непосредственным потомком author-group:


    В данном примере обрабатываются все элементы heading, являющиеся потомками элемента book.



    Есть также возможность обрабатывать элементы, которые не являются потомками текущего узла. В данном примере предполагается, что элемент department имеет непосредственный потомок group и потомки employee. Сперва находится отдел employee, а затем обрабатывается непосредственный потомок group элемента department.

    Employee belongs to group

    Для выполнения простого переупорядочения в пределах одного шаблона можно использовать сразу несколько элементов xsl:apply-templates. В следующем примере создаются две таблицы HTML. Первая таблица заполняется отечественными продажами, вторая - международными.



    Замечание: Может оказаться, что шаблону соответствуют два потомка, причем один из них является потомком другого. Как-то особенно такой случай не обрабатывается: оба потомка будут обработаны обычным образом. Например, дан исходный документ


    правило

    будет обрабатывать и внешний, и внутренний элементы div.

    Замечание: Обычно xsl:apply-templates используется для обработки только тех узлов, которые являются потомками текущего узла. Такое использование xsl:apply-templates не может привести к появлению бесконечных циклов обработки.Однако когда xsl:apply-templates используется для обработки элементов, не являющихся потомками текущего узла, появляется вероятность возникновения бесконечных циклов. Например, Реализации процессора в некоторых случаях могут выявить такие циклы, однако остается вероятность, что стиль попадет в такой бесконечный цикл, который эта реализация не сможет обнаружить. Для безопасности это может представлять угрозу типа "отказ в обслуживании".

    Использование значений переменных и параметров с конструкцией xsl:copy-of


    select = expression />
    Чтобы вставить фрагмент конечного дерева в конечное дерево без предварительного преобразования в строку, как это делает xsl:value-of (см. ), можно использовать элемент xsl:copy-of. Обязательный атрибут select содержит . Если результатом обработки выражения является фрагмент конечного дерева, то этот фрагмент целиком копируется в конечное дерево. Если же результатом является набор узлов, в конечное дерево копируются все узлы этого набора и в том порядке, как они были в документе. Когда копируется узел элемента, вместе с самим узлом элемента копируются также узлы атрибутов, узлы пространства имен и непосредственные потомки этого узла элемента. Копирование корневого узла выполняется копированием его непосредственных потомков. Если результат не является ни набором узлов, ни фрагментом конечного дерева, то он преобразуется в строку, а затем помещается в конечное дерево, как при использовании xsl:value-of.

    Элемент стиля


    id = id
    extension-element-prefixes = tokens

    exclude-result-prefixes = tokens

    version = number>





    id = id

    extension-element-prefixes = tokens

    exclude-result-prefixes = tokens

    version = number>




    В XML документе стиль представлен элементом xsl:stylesheet. В качестве синонима xsl:stylesheet можно использовать xsl:transform. Элемент xsl:stylesheet обязан иметь атрибут version, указывающий какая версия XSLT необходима для этого стиля. Для обсуждаемой версии XSLT значение атрибута должно быть 1.0. Если значение отлично от 1.0, можно использовать режим совместимости с последующими версиями (см. главу ).
    Элемент xsl:stylesheet может содержать следующие типы элементов:
    xsl:import
    xsl:include
    xsl:strip-space
    xsl:preserve-space
    xsl:output
    xsl:key
    xsl:decimal-format
    xsl:namespace-alias
    xsl:attribute-set
    xsl:variable
    xsl:param
    xsl:template

    Элемент, оказавшийся непосредственным потомком элемента xsl:stylesheet, называется элементом верхнего уровня.
    Следующий пример показывает структуру стиля. Многоточием (...) обозначены те места, где опущено значение атрибута или содержимое. Хотя в этом примере показано по одному элементу для каждого разрешенного типа, стиль может не содержать какой-либо из этих элементов, либо содержать сразу несколько его экземпляров.











    ...

    ...

    ...

    ...

    ...



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

    Кроме этого, элемент xsl:stylesheet может содержать любой элемент не из пространства имен XSLT, при условии что расширенное имя этого элемента содержит ненулевой URI пространства имен. Появление таких элементов верхнего уровня не должно сказываться на поведении элементов и функций XSLT, определенных в данном документе. Например, такой элемент верхнего уровня не может заставить xsl:apply-templates использовать другие правила для разрешения конфликтов. Таким образом, XSLT процессор всегда может свободно игнорировать такие элементы верхнего уровня. Более того, процессор обязан игнорировать элемент верхнего уровня, не инициируя ошибки, если не может распознать в нем URI пространства имен. К примеру, такие элементы могут содержать

    информацию, используемую элементами или функциями расширения (см. ),

    информацию о том что следует делать с конечным деревом,

    информацию о том как получить исходное дерево,

    метаданные о представленном стиле,

    структурированную документацию для этого стиля.

    Элементы расширения

    Механизм элементов расширения позволяет строить пространства имен как пространства имен расширений. Если пространство имен построено как пространство имен расширений и в шаблоне обнаружен элемент с именем из этого пространства, то тогда этот элемент обрабатывается как инструкция, а не как фиксированный конечный элемент. Указанное пространство имен определяет семантику этой инструкции.
    Замечание: Поскольку элемент, являющийся непосредственным потомком элемента xsl:stylesheet, в шаблон не попадает, то не-XSLT элементы не относятся к описываемым здесь элементам расширения, не применяется к ним и ни одно из указаний, данных в этой главе.
    Пространство имен объявляется пространством имен расширения с помощью атрибута extension-element-prefixes в элементе xsl:stylesheet, либо атрибута xsl:extension-element-prefixes в фиксированном конечном элементе или элементе расширения. Значением обоих этих атрибутов является перечень (через пробельный символ) префиксов пространства имен. Пространство имен, связанное с каждым из представленных префиксов, рассматривается как пространство имен расширения. Если пространство имен, привязанное к префиксу в элементе, имеющем атрибут extension-element-prefixes или xsl:extension-element-prefixes, отсутствует, фиксируется ошибка. Пространство имен по умолчанию (декларируемое с помощью xmlns) также может быть объявлено как пространство имен расширений если в описываемый перечень префиксов пространства имен включить #default. Объявление пространства имен в качестве пространства имен расширений действительно в стиле в пределах поддерева, начинающегося с того элемента, которому принадлежит атрибут extension-element-prefixes или xsl:extension-element-prefixes. Поддерево, начинающееся с элемента xsl:stylesheet, не включает каких-либо стилей, импортированных или включенных непосредственными потомками этого элемента xsl:stylesheet.
    Если XSLT процессору недоступна реализация определенного элемента расширения, функция в ответ на имя этого элемента должна возвращать false. Когда подобный элемент расширения обрабатывается, XSLT процессор должен выполнить для этого элемента откат, как описано в главе . При этом XSLT процессор не должен фиксировать ошибку только потому, что шаблон содержит элемент расширения, реализация которого оказалась недоступна.
    Если XSLT процессору доступна реализация конкретного элемента расширения, то в ответ на имя этого элемента функция должна возвращать true.

    Ключи

    Ключи дают возможность работать с документами, имеющими неявную структуру перекрестных ссылок. В XML атрибуты типа ID, IDREF и IDREFS создают механизм, позволяющий делать в документах XML перекрестные ссылки явными. В XSLT этот механизм реализуется с помощью функции из XPath. Однако этот механизм имеет ряд ограничений:

  • Атрибуты ID должны быть декларированы в качестве таковых в DTD. Если атрибут ID декларирован в качестве такового лишь во внешнем наборе DTD, то и распознаваться как ID атрибут он будет только тогда, когда процессор XML прочтет этот внешний набор DTD. Однако спецификация XML вовсе не обязует XML процессоры читать этот внешний DTD, а потому процессоры вполне могут этого не делать, особенно если для документа было декларировано standalone="yes".
    Документ может иметь только один набор уникальных ID. Не может быть несколько независимых наборов уникальных атрибутов ID.
    ID элемента может быть задано лишь в атрибуте. Он не может быть задан ни содержимым элемента, ни элементом, являющимся непосредственным потомком.
    ID должен быть именем XML. Например, он не может содержать пробелов.
    Элемент может содержать не более одного ID.
    Любой конкретный ID может принадлежать только одному элементу.

  • Из-за этих ограничений документы XML иногда имеют структуру перекрестных ссылок, которая не была явно декларирована атрибутами ID/IDREF/IDREFS.
    Ключ определяется тремя параметрами:
    узлом, которому принадлежит этот ключ
    названием ключа ()
    значением ключа (строка)

    Набор ключей для каждого документа декларируется в стиле с помощью элемента xsl:key. Если в данном наборе ключей есть член с узлом x, названием y и значением z, то мы говорим, что узел x имеет ключ с названием y и значением z.
    Таким образом, ключ - это такой тип обобщенного ID, на который не распространяются ограничения, принятые для ID в XML:
    Ключи декларируются в стиле с помощью элементов xsl:key.
    Ключи имеют как название, так и значение. Каждое название ключа можно рассматривать как отдельное, независимое пространство идентификаторов.

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

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

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

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


    name = qname
    match = pattern
    use = expression />

    Чтобы декларировать ключи, используется элемент xsl:key. Название создаваемого ключа задает атрибут name. Значением атрибута name является , которое приводится к расширенному имени как было описано в главе . Атрибут match является . Элемент xsl:key дает информацию о ключах во всех узлах, которые соответствуют шаблону, заданному атрибутом match. Атрибут use дает , определяющее значение ключа. Для каждого узла, соответствующего шаблону, это выражение вычисляется отдельно. Если результатом вычисления является набор узлов, то для каждого узла в этом наборе считается, что узлы, соответствующие представленному шаблону, имеют ключ с указанным именем, значением которого является строковое значение данного узла из набора. В противном случае, результат вычисления преобразуется в строку, и соответствующий шаблону узел получает ключ с указанным названием и значением, соответствующим этой строке. Таким образом, узел x имеет ключ с названием y и значением z тогда и только тогда, когда имеется элемент xsl:key, такой что:

    x соответствует шаблону, указанному в атрибуте match данного элемента xsl:key,

    атрибут name элемента xsl:key имеет значение, равное y, и

    если выражение, заданное атрибутом use элемента xsl:key, обрабатывается с текущим узлом x, а в качестве текущего набора узлов используется список, состоящий из одного x, и при этом результатом является объект u, то либо z равно результату преобразования объекта u в строку (как при вызове функции ), либо u - это набор узлов, а z равно строковому значению одного или нескольких узлов из набора u.


    Заметим также, что одному узлу может соответствовать несколько элементов xsl:key. В этом случае будут использованы все совпавшие элементы xsl:key, даже если они имеют разный .

    Если значение атрибутов use или match содержит , фиксируется ошибка.

    Функция: набор-узлов key(строка, объект)

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

    Например, дана декларация



    выражение key("idkey",@ref) возвратит тот же набор узлов, что и id(@ref), при условии, что в исходном XML-документе был декларирован единственный атрибут ID:



    а атрибут ref текущего узла не содержит пробельных символов.

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



    а чтобы обратиться к названию функции используется элемент function

    key

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




    Function: ...


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

    ...

    В этом случае в стиле можно использовать следующий вариант преобразования элементов bibref:





    Комбинированные стили

    Язык XSLT предоставляет два механизма для комбинирования стилей:
  • механизм включения (include), позволяющий объединять стили без изменения семантики комбинированных стилей, и
  • механизм импорта (import), который позволяет стилям переписывать друг друга.


  • Копирование


    use-attribute-sets = qnames>


    Элемент xsl:copy дает простой способ копировать текущий узел. В результате обработки элемента xsl:copy создается копия текущего узла. Узлы пространства имен текущего узла копируются автоматически как есть, однако ни атрибуты, ни потомки этого узла автоматически не копируются. Содержимое элемента xsl:copy является шаблоном для атрибутов и непосредственных потомков создаваемого узла. Указанное содержимое элемента обрабатывается для узлов только тех типов, которые могут иметь атрибуты или потомки (т.е. для корневых узлов и узлов элементов).
    Элемент xsl:copy может иметь атрибут use-attribute-sets (см. ). Последний используется только при копировании узлов элементов.
    Корневой узел обрабатывается особым образом, поскольку корневой узел в конечном дереве создается неявно. Если текущий узел является корневым, то xsl:copy не будет создавать корневого узла, а будет использован только шаблон его содержимого.
    Например, тождественное преобразование может быть записано с помощью xsl:copy следующим образом:

    Когда текущий узел является атрибутом, если попытка использовать xsl:attribute для создания нового атрибута с тем же именем что и текущий узел приводит к ошибке, то ошибкой будет также использовать xsl:copy (см. ).
    Следующий пример показывает как атрибуты xml:lang могут быть легко скопированы из исходного дерева в конечное. Если в стиле определен следующий именованный шаблон:

    то вместо

    можно легко сделать

    если необходимо скопировать атрибут xml:lang.

    Метод вывода HTML

    Метод вывода html представляет конечное дерево в виде HTML. Например,


    ...

    Атрибут version показывает версию HTML. Значением по умолчанию является 4.0, означающее, что результат должен быть выведен как HTML документ, отвечающий Рекомендации HTML 4.0 .
    Метод вывода html не должен представлять элемент, иначе чем метод xml, если расширенное имя этого элемента имеет ненулевой URI пространства имен. Элемент, чье расширенное имя имеет ненулевой URI пространства имен, должен быть представлен как XML. Если расширенное имя элемента имеет нулевой URI пространства имен, но локальная часть этого имени как название элемента HTML не распознается, этот элемент должен быть представлен как непустой встроенный элемент, такой как span.
    Метод вывода html для пустых элементов не должен показывать конечный тэг. В HTML 4.0 пустыми элементами являются area, base, basefont, br, col, frame, hr, img, input, isindex, link, meta и param. Например, элемент, указанный в стиле как
    или

    , должен быть представлен как
    .
    Метод вывода html должен распознавать названия HTML элементов независимо от регистра. Например, все элементы с названиями br, BR и Br должны распознаваться как HTML элемент br и показываться без закрывающего тэга.
    Метод вывода html не должен выполнять маскирование содержимого элементов script и style. Например, фиксированный конечный элемент, записанный в стиле как

    или

    должен быть представлен как

    Метод вывода html не должен маскировать символы <, встретившиеся в значении атрибутов.

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

    В значении атрибутов URI метод вывода html должен маскировать символы, не относящиеся к набору ASCII, используя метод, рекомендованный в главе Рекомендации HTML 4.0.

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

    Инструкции обработки метод вывода html должен завершать символом >, а не комбинацией ?>.

    Булевы атрибуты (то есть, такие атрибуты, которым разрешено иметь только одно значение - название самого атрибута) метод вывода html должен показывать в минимизированной форме. Например, начальный тэг, записанный в стиле как