Образцы и шаблоны
Основными компонентами документа XSLT являются правила шаблона. Правило шаблона состоит из двух частей: это образец (pattern), который сопоставляется с узлами в исходном дереве, и шаблон (template), который содержит конструктор последовательности, используемой для создания фрагментов результирующей иерархической структуры.
Преобразование в XSLT состоит не из последовательности действий, как в языках программирования, а из набора правил шаблона, каждое из которых обрабатывает свою часть документа XML.
Чтобы получить фрагмент результирующей структуры, шаблон обрабатывается для определенного элемента в исходной структуре. Шаблон может содержать элементы, определяющие фиксированную структуру элемента в результирующей структуре (аналог прямого конструктора в XQuery), а также элементы из пространства имен XSLT, содержащие инструкции по формированию фрагментов результирующей структуры (аналог вычисляемого конструктора в XQuery).
При поиске соответствующего правила шаблона может возникнуть ситуация, когда обрабатываемому элементу соответствует не одно, а несколько правил. В этом случае выбирается правило с самым большим приоритетом (если правил с одинаковым приоритетом окажется несколько, генерируется ошибка).
В правиле шаблона образец задает перечень условий для обрабатываемого узла. Узел, который отвечает этим условиям, шаблону соответствует, а узел, который условиям не отвечает, шаблону не соответствует. Синтаксис шаблонов является подмножеством синтаксиса выражений XPath. В частности, в качестве шаблонов могут использоваться пути адресации, которые отвечают определенным ограничениям.
Образец для пути адресации – это некоторый путь адресации, на всех шагах которого используются лишь оси child или attribute. Хотя образцы и не должны использовать ось descendant-or-self, в образцах могут использоваться как оператор "//", так и оператор "/". Образцы путей адресации могут начинаться также с вызова функций id или key с фиксированным аргументом. В предикатах образца могут использоваться произвольные выражения.
Примеры образцов:
1. Образец "/" соответствует корневому узлу.
2. Образец "*" соответствует любому элементу.
3. Образец "document-node()" соответствует узлу документа.
4. Образец "schema-element(book:publisher)" соответствует любому элементу в документе, определенному как реализация элемента book:publisher в схеме документа.
5. Образец "attribute(*, xs:gYear)" соответствует любому атрибуту документа, имеющему тип xs:gYear.
6. Образец "chapter" соответствует любому элементу chapter.
7. Образец "chapter|appendix" соответствует любому элементу chapter и любому элементу appendix.
8. Образец "list/item" соответствует любому элементу item с родителем list.
9. Образец "partition//paragraph" соответствует любому элементу paragraph, предком которого является элемент partition.
10. Образец "paragraph[1]" соответствует любому первому дочернему элементу paragraph.
11. Образец "text()" соответствует любому текстовому узлу.
12. Образец "node()" соответствует любому узлу за исключением узла атрибута и корневого узла.
13. Образец "div[@class="chapter"]//p" соответствует любому элементу p, предком которого является элемент div, имеющий атрибут class со значением chapter.
14. Образец "@class" соответствует любому атрибуту class (но не любому элементу, имеющему атрибут class).
15. Образец "@*" соответствует любому атрибуту.
16. Образец "id('p1')" соответствует элементу с уникальным ID p1.
В шаблонах атрибутов могут присутствовать фиксированные и вычисляемые компоненты. Вычисляемые компоненты, как и в конструкторах XQuery заключаются в фигурные скобки "{" и "}". При преобразовании эти компоненты будут вычислены и заменены своим результатом.
Если символы "{" и "}" используются в шаблонах атрибутов как обычные символы, они должны быть удвоены, т.е. заменены символами "{{" и "}}".
Дата добавления: 2015-03-20; просмотров: 763;