просто удалить из документа некоторые узлы. Например, нам необходимо избавиться от комментариев (быстро и без шума).
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:import href='identity.xsl'/>
<xsl:template match='comment()'/>
</xsl:stylesheet>
Разрешение конфликтов в шаблонах
Как правило, каждое преобразование в XSLT определяет, включает или импортирует множество шаблонов, которые обрабатывают указанные части документов. При этом один и тот же узел документа может соответствовать нескольким шаблонным правилам. К примеру, элемент content может быть обработан любым из следующих трех шаблонов.
<xsl:template match='*'>
<element/>
</xsl:template>
<xsl:template match='node()'>
<node/>
</xsl:template>
<xsl:template match='content'>
<content/>
</xsl:template>
Ситуация, когда для обработки узла может быть применено несколько правил, называется конфликтом шаблонов. Конфликты такого рода неизбежны практически в любом преобразовании, к примеру, большинство шаблонов будет вступать в конфликт со встроенными правилами преобразования.
Для того чтобы в конфликтной ситуации решить, какой именно из шаблонов должен быть применен к данному узлу, процессоры используют два простых правила.
□ Шаблоны, имеющие младший порядок импорта, исключаются из рассмотрения. Иными словами, из множества правил, подходящих для обработки текущего узла, остаются только правила, имеющие самый старший порядок импорта.
□ Из оставшегося множества выбирается шаблон с наивысшим приоритетом. Если таких шаблонов несколько, процессор может либо выдать ошибку, либо применить тот, который описан в преобразовании последним.
Во втором из этих двух правил, мы встретились с понятием приоритета шаблона. Приоритет шаблона это не что иное, как численное значение, которое может быть указано в атрибуте priority элемента xsl:template. В том случае, если значение этого атрибута не определено, приоритет шаблонного правила вычисляется следующим образом.
□ Прежде всего, шаблон, который обрабатывает несколько альтернатив, перечисленных через знак '|', будет рассматриваться как множество шаблонов, обрабатывающих каждую из возможностей. Например, шаблон с атрибутом match='b|bold|B' будет рассматриваться как три одинаковых шаблона с атрибутами match='b', match='bold' и match='B' соответственно.
□ Если паттерн состоит из имени (QName) или конструкции processing- instruction(, которым предшествует дескриптор оси дочернего узла или атрибута (ChildOrAttributeAxisSpecifier), приоритет шаблона равен 0. Такие паттерны могут иметь следующий вид:
• или child:: — выбор дочерних элементов;
• @ или attribute:: — выбор атрибутов;
• processing-instruction( или child::processing-instruction( — именной выбор дочерних инструкций по обработке.
Примеры паттернов с приоритетом, равным 0:
• content — выбор дочернего элемента content;
• fo:content — выбор дочернего элемента content с префиксом пространств имен fo;
• child::processing-instruction('арр') — выбор дочерних инструкций по обработке, которые имеют вид <?app содержимое?>;
• @xsd:name — выбор атрибута xsd:name текущего узла;
• @select — выбор атрибута select текущего узла.
□ Если паттерн состоит из конструкции NCName:*, которой предшествует ChildOrAxisSpecifier, приоритет шаблона будет равен -0.25. Такие паттерны могут иметь следующий вид:
• или child:: — выбор всех дочерних элементов в определенном пространстве имен;
• @ или attribute:: — выбор всех атрибутов в определенном пространстве имен.
Примеры паттернов с приоритетом, равным -0.25:
• fo:* — выбор всех дочерних элементов в пространстве имен с префиксом fo;
• attribute::xsl:* — выбор всех атрибутов текущего элемента, которые находятся в пространстве имен с префиксом xsl.
□ Если паттерн состоит из проверки узла (NodeTest), которой предшествует ChildOrAttributeAxisSpecifier, приоритет шаблона будет равен -0.5. Паттерны такого рода будут выглядеть как:
• или child:: — выбор всех дочерних узлов, соответствующих данной проверке;
• или attribute:: — выбор всех атрибутов, соответствующих данной проверке.
□ Примеры паттернов с приоритетом, равным -0.5:
• text() — выбор дочерних текстовых узлов;
• child::comment() — выбор дочерних комментариев;
• @* — выбор всех атрибутов данного шаблона.
□ Если ни одно из предыдущих условий не выполняется, приоритет шаблона равен 0.5.
Для удобства использования составим таблицу (табл. 5.1) с приоритетами тех или иных
