[an error occurred while processing this directive]

2 Структура стиля

2.1 Пространство имен XSLT

Пространство имен XSLT имеет URI http://www.w3.org/1999/XSL/Transform.

Замечание: Число 1999 в этом URI показывает год, в который этот URI был принят W3C. И это не версия используемого XSLT, которая задается атрибутами (см. главы [2.2 Элемент стиля] и [2.3 Фиксированный конечный элемент как стиль]).

Чтобы идентифицировать элементы и атрибуты из указанного пространства, XSLT процессоры должны использовать механизм пространства имен XML [Имена XML]. Элементы из пространства имен XSLT распознаются только в стиле, а не в исходном документе. Полный перечень элементов, определенных в XSLT, представлен в Приложении [B Справочник синтаксиса элементов]. Разработчики не должны пополнять пространство имен XSLT дополнительными элементами и атрибутами. Вместо этого любое расширение должно быть вынесено в отдельное пространство имен. Какое бы пространство имен не использовалось для дополнительных элементов инструкций, оно должно быть идентифицировано с помощью механизма элементов расширения, описанного в главе [14.1 Элементы расширения].

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

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

Если элемент из пространства имен XSLT имеет атрибут, чье расширенное имя имеет нулевой URI пространства имен (т.е. атрибут с названием без префиксов), и который не входит в число атрибутов, определенных для этого элемента в данном документе, фиксируется ошибка.

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

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

<xsl:stylesheet
  id = id
  extension-element-prefixes = tokens
  exclude-result-prefixes = tokens
  version = number>
  <!-- Content: (xsl:import*, top-level-elements) -->
</xsl:stylesheet>

<xsl:transform
  id = id
  extension-element-prefixes = tokens
  exclude-result-prefixes = tokens
  version = number>
  <!-- Content: (xsl:import*, top-level-elements) -->
</xsl:transform>

В XML документе стиль представлен элементом xsl:stylesheet. В качестве синонима xsl:stylesheet можно использовать xsl:transform.

Элемент xsl:stylesheet обязан иметь атрибут version, указывающий какая версия XSLT необходима для этого стиля. Для обсуждаемой версии XSLT значение атрибута должно быть 1.0. Если значение отлично от 1.0, можно использовать режим совместимости с последующими версиями (см. главу [2.5 Обработка, совместимая с последующими версиями]).

Элемент xsl:stylesheet может содержать следующие типы элементов:

Элемент, оказавшийся непосредственным потомком элемента xsl:stylesheet, называется элементом верхнего уровня.

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

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

  <xsl:include href="..."/>

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

  <xsl:output method="..."/>

  <xsl:key name="..." match="..." use="..."/>

  <xsl:decimal-format name="..."/>

  <xsl:namespace-alias stylesheet-prefix="..." result-prefix="..."/>

  <xsl:attribute-set name="...">
    ...
  </xsl:attribute-set>

  <xsl:variable name="...">...</xsl:variable>

  <xsl:param name="...">...</xsl:param>

  <xsl:template match="...">
    ...
  </xsl:template>

  <xsl:template name="...">
    ...
  </xsl:template>

</xsl:stylesheet>

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

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

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

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

<html xsl:version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns="http://www.w3.org/TR/xhtml1/strict">
  <head>
    <title>Expense Report Summary</title>
  </head>
  <body>
    <p>Total Amount: <xsl:value-of select="expense-report/total"/></p>
  </body>
</html>

что равнозначно

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:template match="/">
<html>
  <head>
    <title>Expense Report Summary</title>
  </head>
  <body>
    <p>Total Amount: <xsl:value-of select="expense-report/total"/></p>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

Фиксированный конечный элемент, являющийся для стиля элементом документа, должен иметь атрибут xsl:version, указывающий версию XSLT, необходимую для этого стиля. Для данной версии XSLT значением этого атрибута должно быть 1.0, значение должно иметь тип Number. Другие фиксированные конечные элементы также должны иметь атрибут xsl:version. Если атрибут xsl:version не равен 1.0, должен быть разрешен режим обработки, совместимый с последующими версиями. (см. главу [2.5 Обработка, совместимая с последующими версиями]).

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

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

Замечание: Например, другой язык XML (AXL) также может использовать в элементе документа атрибут axl:version чтобы показать, что XML документ является AXL документом, который необходимо обрабатывать AXL процессором. Если документ имеет оба указанных атрибута axl:version, становится непонятным, следует ли данный документ обрабатывать XSLT процессором или же AXL процессором.

По этой причине упрощенный синтаксис не должен использоваться для XSLT стилей, которые могут оказаться в такой ситуации. Например, такая ситуация может возникать когда стиль XSLT передается как сообщение с типом среды MIME text/xml или application/xml, а получатель использует этот тип среды MIME чтобы определить, как следует обрабатывать это сообщение.

2.4 Полные имена

Название внутреннего объекта XSLT, а именно: именованного шаблона (см. [6 Именованные шаблоны]), режима (см. [5.7 Режимы]), набора атрибутов (см. [7.1.4 Именованные наборы атрибутов]), ключа (см. [12.2 Ключи]), десятичного формата (см. [12.3 Форматирование чисел]), переменной или параметра (см. [11 Переменные и параметры]), задается как QName. Если название имеет префикс, то этот префикс преобразуется в ссылку URI с помощью деклараций пространства имен, в области действия оказался атрибут с этим названием. В качестве названия указанного объекта используется расширенное имя, состоящее из локальной части и, возможно нулевой, ссылки URI. Для названий без префиксов пространство имен по умолчанию не используется.

2.5 Обработка, совместимая с последующими версиями

Режим совместимости с последующими версиями можно использовать для самого элемента, его атрибутов, его потомков и их атрибутов, если имеется элемент xsl:stylesheet с атрибутом version, значение которого отлично от 1.0, или имеется фиксированный конечный элемент, имеющий атрибут xsl:version со значением, отличным от 1.0, либо имеется фиксированный конечный элемент, не имеющий атрибута xsl:version, но элемент документа в стиле использует упрощенный синтаксис (см. [2.3 Фиксированный конечный элемент как стиль]). Фиксированный конечный элемент, имеющий атрибут xsl:version, значение которого равно 1.0, отменяет режим совместимости с последующими версиями для себя, своих атрибутов, своих потомков и их атрибутов.

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

Таким образом, любой процессор XSLT 1.0 должен уметь обработать представленный далее стиль без ошибок, даже несмотря на то, что тот содержит элементы из пространства имен XSLT, которые не были заданы в этой спецификации:

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

  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="system-property('xsl:version') >= 1.1">
        <xsl:exciting-new-1.1-feature/>
      </xsl:when>
      <xsl:otherwise>
        <html>
        <head>
          <title>XSLT 1.1 required</title>
        </head>
        <body>
          <p>Sorry, this stylesheet requires XSLT 1.1.</p>
        </body>
        </html>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
Замечание: Если стиль опосредованно зависит от элемента верхнего уровня, объявленного в XSL более старшей версии чем 1.0, то тогда в этом стиле можно использовать элемент xsl:message с атрибутом terminate="yes" (см. [13 Сообщения]) чтобы гарантировать, что XSLT процессоры, реализующие более ранние версии XSL, не будут втихую игнорировать указанный элемент верхнего уровня. Например,
<xsl:stylesheet version="1.5"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:important-new-1.1-declaration/>

  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="system-property('xsl:version') &lt; 1.1">
        <xsl:message terminate="yes">
          <xsl:text>Sorry, this stylesheet requires XSLT 1.1.</xsl:text>
        </xsl:message>
      </xsl:when>
      <xsl:otherwise>
        ...
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  ...
</xsl:stylesheet>

Если выражение встретилось в атрибуте, который обрабатывается в режиме совместимости со следующими версиями, то ошибки XSLT процессор должен обрабатывать следующим образом:

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

Язык XSLT предоставляет два механизма для комбинирования стилей:

2.6.1 Включение стилей

<!-- Category: top-level-element -->
<xsl:include
  href = uri-reference />

С помощью элемента xsl:include один стиль XSLT может включить в себя другой стиль XSLT. Элемент xsl:include имеет атрибут href, значением которого является ссылка URI, идентифицирующая включаемый стиль. Относительная ссылка URI обрабатывается относительно базового URI элемента xsl:include (см. [3.2 Базовый URI]).

Элемент xsl:include можно использовать лишь в качестве элемента верхнего уровня.

Включение оперирует деревьями XML. Ресурс, на который указывает атрибут href, обрабатывается как документ XML и обнаруженные в нем непосредственные потомки элемента xsl:stylesheet замещают элемент xsl:include во включающем документе. Тот факт, что те или иные правила шаблона или определения были получены включением, на то как они затем обрабатываются не влияет.

Во включаемом стиле может использоваться упрощенный синтаксис, описанный в главе [2.3 Фиксированный конечный элемент как стиль]. Включаемый стиль обрабатывается точно так же как эквивалентный ему элемент xsl:stylesheet.

Если стиль прямо или опосредовано включает сам себя, фиксируется ошибка.

Замечание: Многократное включение стиля может привести к ошибкам вследствие дублирования деклараций. Такие множественные включения не столь очевидны, если являются косвенными. Например, если стиль B включает стиль A, стиль C включает стиль A, а стиль D включает оба стиля B и C, то A опосредованно включено в D дважды. Если все указанные стили B, C и D являются независимыми, то ошибки можно избежать, если в B выделить все, что не относится к включенному A, в отдельный стиль B' и поменять B так чтобы он просто включал эти B' и A, затем аналогично поступить с C, и, наконец, переписать D так чтобы он включал A, B' и C'.

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

<xsl:import
  href = uri-reference />

С помощью элемента xsl:import один XSLT стиль может импортировать другой стиль XSLT. Импортирование стиля похоже на его включение (см. [2.6.1 Включение стилей]) за исключением того, что определения и правила шаблона в испортирующем стиле имеют приоритет над правилами шаблона и определениями в импортируемом стиле, более детально это будет обсуждаться ниже. Элемент xsl:import имеет атрибут href, значением которого является ссылка URI, идентифицирующая импортируемый стиль. Относительная ссылка URI обрабатывается относительно базового URI элемента xsl:import (см. [3.2 Базовый URI]).

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

Например,

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="article.xsl"/>
  <xsl:import href="bigfont.xsl"/>
  <xsl:attribute-set name="note-style">
    <xsl:attribute name="font-style">italic</xsl:attribute>
  </xsl:attribute-set>
</xsl:stylesheet>

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

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

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

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

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

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

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

2.7 Встроенные стили

Обычно стиль XSLT является полноценным XML документом с элементом xsl:stylesheet в качестве элемента документа. Однако стиль XSLT может вынесен и в другой источник. Возможны два варианта размещения:

Чтобы содействовать второму варианту размещения, элемент xsl:stylesheet может иметь атрибут ID, который задает уникальный идентификатор.

Замечание: Чтобы такой атрибут можно было использовать с функцией id из XPath, он реально должен быть декларирован в DTD как ID.

Следующий пример показывает, каким образом можно использовать инструкцию обработки xml-stylesheet [Стиль XML] чтобы позволить документу содержать свой собственный стиль. Чтобы найти элемент xsl:stylesheet, ссылка URI использует относительный URI с идентификатором фрагмента:

<?xml-stylesheet type="text/xml" href="#style1"?>
<!DOCTYPE doc SYSTEM "doc.dtd"> <doc>
<head>
<xsl:stylesheet id="style1"
                version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:import href="doc.xsl"/>
<xsl:template match="id('foo')">
  <fo:block font-weight="bold"><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="xsl:stylesheet">
  <!-- игнорируется -->
</xsl:template>
</xsl:stylesheet>
</head>
<body>
<para id="foo">
...
</para>
</body>
</doc>
Замечание: Стиль, который вложен в документ, к которому должен быть применен, либо стиль, включенный или импортированный в такой стиль, как правило, должен иметь правило шаблона, сообщающее, что элементы xsl:stylesheet должны быть проигнорированы.

Назад | Содержание | Вперед

  [an error occurred while processing this directive]