Элемент <xsl:template>

Определяет повторно используемый шаблон для формирования желаемого вывода для узлов определенного типа в определенном контексте.

<xsl:template
  name= Qname
  match = Pattern
  priority = number
  mode = QName
</xsl:template>

Атрибуты

  • имя
    Имя Полные имена (XSLT), которое будет расширено. Если у имени есть префикс, он будет расширен до URI-ссылки с помощью объявлений пространств имен, действующих для атрибута, в котором встретилось это имя. Расширенное имя, состоящее из локальной части имени и (возможно, пустой) URI-ссылки, используется в качестве имени шаблона. Для имен без префикса пространство имен по умолчанию не используется. Если элемент <xsl:template> имеет атрибут name, он может (но не обязан) иметь также атрибут match.

  • match
    Шаблон Шаблоны (XSLT), указывающий на исходный узел или исходные узлы, к которым применяется правило. Атрибут match является обязательным, кроме случаев, когда у элемента <xsl:template> есть атрибут name. Содержимое элемента <xsl:template> является шаблоном, экземпляр которого создается при применении правила шаблона.

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

    • Если шаблон содержит несколько альтернативных значений, разделенных вертикальной чертой («|»), то он интерпретируется как набор правил шаблона, по одному на каждую альтернативу.

    • Если шаблон имеет вид Qname, перед которым стоит спецификатор оси дочерних объектов или атрибутов, или вид литерал инструкции по обработке, перед которым стоит спецификатор оси дочерних объектов или атрибутов, то его приоритет равен 0.

    • Если шаблон представляет собой имя, перед которым стоит спецификатор оси дочерних объектов или атрибутов, то приоритет равен -0,25.

    • В противном случае, если шаблон состоит только из теста узла, перед которым стоит спецификатор оси дочерних объектов или атрибутов, то приоритет равен -0,5.

    • В противном случае приоритет равен 0,5.

    Таким образом, наиболее стандартный вид шаблона (шаблон, который тестирует наличие узла с определенным типом и развернутым именем) имеет приоритет 0. Следующий по убыванию определенности вид шаблонов (шаблон, который тестирует наличие узла с определенным типом и расширенным именем с определенным URI-кодом пространства имен) имеет приоритет -0,25. Менее конкретные шаблоны (те, которые просто тестируются для узлов определенных типов) имеют приоритет -0,5. Шаблоны, более конкретные, чем наиболее распространенный вид шаблона, имеют приоритет 0,5.

  • режим
    Значение режима. Это значение позволяет обрабатывать элемент несколько раз и каждый раз получать другой результат. Если элемент <xsl:template> не имеет атрибута match, то у него не может быть атрибута mode. Если элемент <xsl:apply-templates> имеет атрибут mode, то он относится только к тем правилам шаблона из элементов <xsl:template>, которые имеют атрибуты mode с тем же значением. Если у элемента <xsl:apply-templates> нет атрибута mode, то он относится только к тем правилам шаблона из элемента <xsl:template>, у которых нет атрибута mode.

Сведения об элементе

Количество вхождений

Без ограничений

Родительские элементы

xsl:stylesheet, xsl:transform

Дочерние элементы

xsl:apply-imports,xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:fallback, xsl:for-each, xsl:if, xsl:message, xsl:number, xsl:param, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, элементы вывода

Заметки

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

Значением атрибута name является расширенное имя QName. Если у имени есть префикс, он будет расширен до URI-ссылки с помощью объявления пространств имен, действующих для атрибута, в котором встретилось это имя. Расширенное имя, состоящее из локальной части имени и (возможно, пустой) ссылки на URI-идентификатор используется в качестве имени шаблона. Для имен без префикса пространство имен по умолчанию не используется.

Если элемент <xsl:template> имеет атрибут name, он может (но не обязан) иметь также атрибут match. Элемент <xsl:call-template> вызывает шаблон по имени. Имеется обязательный атрибут name, определяющий вызываемый шаблон. В отличие от элемента <xsl:apply-templates>, элемент <xsl:call-template> не меняет ни текущего узла, ни текущего списка узлов.

Если таблица стилей содержит несколько шаблонов с одним и тем же именем, возникает ошибка.

Пример

У этого правила шаблона есть шаблон, который обнаруживает элементы <stock> и создает в качестве вывода элемент <DIV> с атрибутом STYLE="font-weight:bold":

XML-файл (portfolio.xml)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="templ.xsl"?>
<portfolio xmlns:dt="urn:schemas-microsoft-com:datatypes" xml:space="preserve">
  <stock exchange="nyse">
    <name>zacx corp</name>
    <symbol>ZCXM</symbol>
    <price dt:dt="number">28.875</price>
  </stock>
  <stock exchange="nasdaq">
    <name>zaffymat inc</name>
    <symbol>ZFFX</symbol>
    <price dt:dt="number">92.250</price>
  </stock>
  <stock exchange="nasdaq">
    <name>zysmergy inc</name>
    <symbol>ZYSZ</symbol>
    <price dt:dt="number">20.313</price>
  </stock>
</portfolio>

XSLT-файл (templ.xslt)

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="stock">
   <DIV STYLE="font-weight:bold">
      Symbol: <xsl:value-of select="symbol" />, 
      Price: <xsl:value-of select="price" />
   </DIV>
</xsl:template>

</xsl:stylesheet>

Вывод

Далее приведен форматированный вывод.

Symbol: ZCXM, Price: 28.875

Symbol: ZFFX, Price: 92.250

Symbol: ZYSZ, Price: 20.313