Speak.Me Учить иностранные слова

XSL: шаблоны (xsl:template)

Основой преобразования элементов исходного дерева в конечное являются инструкции или правила, содержащиеся в так называемых шаблонах (Template). В XSL документе шаблоны задаются с помощью элемента xsl:template.

Процесс xslt-преобразования выглядит следующим образом: XSLT-процессор анализирует исходный XML-документ, последовательно перебирая каждый его элемент. При этом для каждого элемента процессор пытается найти подходящий шаблон (template) в XSL-файле путем сопоставлении исходного элемента и содержащегося в шаблоне образца (pattern). Если подходящий шаблон не найден, используется шаблон по умолчанию и процессор переходит к следующему элементу в исходном XML-документе. Если подходящий шаблон (template) найден процессор выполняет содержащиеся в шаблоне инструкции (Template Rules – правила шаблона), на основании чего строится конечное дерево. При этом текущим узлом для шаблона будет являться обрабатываемый узел XML-документа. В шаблоне могут содержаться правила (инструкции), выбирающие новый текущий узел.

Синтаксис:

Атрибуты:

  • match – обязательный атрибут, задает образец (pattern), который определяет узлы исходного дерева, к которым данный шаблон должен быть применен. Образец записывается на языке XPath.
  • priority – задает приоритет шаблона, который учитывается при разрешении конфликтов шаблонов. Значением этого атрибута должно быть реальное число (положительное или отрицательное). При конфликте шаблонов (т.е. если исходному элементу соответствуют несколько шаблонов) применяется шаблон с наивысшим приоритетом.
  • mode – задает режим. Режимы позволяют обрабатывать элемент несколько раз, получая каждый раз другой результат. Подробнее режимы будут сказано при рассмотрении инструкции xsl:apply-templates.
  • name – задает имя шаблона, которое может быть использовано в инструкции xsl:call-template. Если элемент xsl:template содержит атрибут name, то атрибут match не является обязательным.

Внутри элемента xsl:template задаются инструкции (правила) шаблона и фиксированные конечные элементы.

Встроенные шаблоны

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

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

Встроенный шаблон для текстовых узлов и узлов атрибутов просто копирует текст:

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

Если в конечное дерево необходимо включить инструкцию обработки или комментарий, то для этого используются специальные инструкции xsl:processing-instruction и xsl:comment. Следует особо отметить одну важную особенность: если для элемента не указан шаблон, то будет применен встроенный шаблон, в соответствии с которым и сам элемент и все его потомки будут обработаны соответствующим образом. Но если для элемента задан шаблон, то его потомки войдут в конечное дерево, только если в шаблоне содержится инструкция xsl:apply-templates. Встроенный шаблоны обрабатываются так, как будто они были неявно импортированы прежде стиля, а потому имеют меньший приоритет импорта, чем все остальные шаблоны. Таким образом, пользователь может переопределить шаблон по умолчанию, явно включив новый шаблон.

Инструкции или правила шаблона

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

  • xsl:apply-templates
  • xsl:call-template
  • xsl:element
  • xsl:attribute
  • xsl:text
  • xsl:processing-instruction
  • xsl:comment
  • xsl:copy
  • xsl:value-of
  • xsl:copy-of
  • xsl:number
  • xsl:for-each
  • xsl:if
  • xsl:choose
  • xsl:when
  • xsl:otherwise
  • xsl:sort
  • xsl:message

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

Помимо инструкций в шаблоне могут содержаться и другие элементы, не относящиеся к пространству имен XSL (т.е. не являющиеся инструкциями XSL), а введенные пользователем. Как правило, это теги HTML, но не только. По сути, пользователь может включить в шаблон любые элементы с одним ограничением: каждый из них и все они в целом должны соответствовать правилам XML, ведь xsl-документ является xml-документом. Такие элементы, введенные пользователем, получили название фиксированные конечные элементы. Называются они так потому, что переносятся в конечное дерево без каких-либо изменений. Их содержимым (т.е. потомками) могут являться как другие фиксированные конечные элементы, в том числе текстовые (т.е. просто текст), так и инструкции XSL. Инструкции в этом случае, как обычно, будут обрабатываться процессором, а фиксированные конечные элементы просто переноситься в него без изменений.

Шаблон значения атрибута

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