Содержание
Основой преобразования элементов исходного дерева в конечное являются инструкции или правила, содержащиеся в так называемых шаблонах (Template). В XSL документе шаблоны задаются с помощью элемента xsl:template
.
Процесс xslt-преобразования выглядит следующим образом: XSLT-процессор анализирует исходный XML-документ, последовательно перебирая каждый его элемент. При этом для каждого элемента процессор пытается найти подходящий шаблон (template) в XSL-файле путем сопоставлении исходного элемента и содержащегося в шаблоне образца (pattern). Если подходящий шаблон не найден, используется шаблон по умолчанию и процессор переходит к следующему элементу в исходном XML-документе. Если подходящий шаблон (template) найден процессор выполняет содержащиеся в шаблоне инструкции (Template Rules – правила шаблона), на основании чего строится конечное дерево. При этом текущим узлом для шаблона будет являться обрабатываемый узел XML-документа. В шаблоне могут содержаться правила (инструкции), выбирающие новый текущий узел.
Синтаксис:
1 2 3 4 5 6 7 | <xsl:template match = "образец" name = "строка" priority = "число" mode = "строка"> Инструкции или фиксированные конечные элементы </xsl:template> |
Атрибуты:
match
– обязательный атрибут, задает образец (pattern), который определяет узлы исходного дерева, к которым данный шаблон должен быть применен. Образец записывается на языке XPath.priority
– задает приоритет шаблона, который учитывается при разрешении конфликтов шаблонов. Значением этого атрибута должно быть реальное число (положительное или отрицательное). При конфликте шаблонов (т.е. если исходному элементу соответствуют несколько шаблонов) применяется шаблон с наивысшим приоритетом.mode
– задает режим. Режимы позволяют обрабатывать элемент несколько раз, получая каждый раз другой результат. Подробнее режимы будут сказано при рассмотрении инструкцииxsl:apply-templates
.name
– задает имя шаблона, которое может быть использовано в инструкцииxsl:call-template
. Если элементxsl:template
содержит атрибутname
, то атрибутmatch
не является обязательным.
Внутри элемента xsl:template
задаются инструкции (правила) шаблона и фиксированные конечные элементы.
Встроенные шаблоны
В том случае если процессору не удается найти подходящий шаблон для текущего узла, используются так называемые встроенные шаблоны (шаблоны по умолчанию). Существуют встроенные шаблоны для элементов, для режимов, для текстовых узлов и узлов атрибутов, для инструкций обработки и комментариев. Встроенный шаблон для элементов эквивалентен следующему шаблону:
1 2 3 | <xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> |
Этот шаблон применяется к корневому элементу и ко всем его потомкам (только элементам). Он дает указание процессору идти дальше по дереву и применять шаблоны для всех дочерних узлов текущего элемента. Сам текущий элемент копироваться в конечное дерево или как-то иначе трансформироваться не будет. Встроенный шаблон для режимов применяется в тех случаях, когда процессору не удается найти шаблон с соответствующим режимом. Он эквивалентен следующему шаблону:
1 2 3 | <xsl:template match="*|/" mode="название_режима"> <xsl:apply-templates mode="название_режима"/> </xsl:template> |
Встроенный шаблон для текстовых узлов и узлов атрибутов просто копирует текст:
1 2 3 | <xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template> |
Встроенный шаблон для инструкций обработки и комментариев не производит никаких действий, т.е. инструкции обработки и комментарии в конечное дерево не переносятся:
1 | <xsl:template match="processing-instruction()|comment()"/> |
Если в конечное дерево необходимо включить инструкцию обработки или комментарий, то для этого используются специальные инструкции 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, заключенное в фигурные скобки, получило название шаблон значения атрибута.