Приоритет шаблона XSL - PullRequest
       1

Приоритет шаблона XSL

23 голосов
/ 19 апреля 2011

У меня есть 2 шаблона

<template match="vehicle_details[preceding-sibling::vehicle_type = '4x4']/*">
    ...
</xsl:template>
<xsl:template match="vehicle_details[descendant::color = 'red']/*" >
    ...
</xsl:template>

Мой вопрос: какой шаблон будет иметь приоритет при преобразовании. И может ли кто-нибудь дать мне обзор / ресурсы о приоритете шаблона XSL?

Заранее спасибо!

1 Ответ

43 голосов
/ 19 апреля 2011

Процесс полного разрешения описан в * 5.51 * разделе 5.5 спецификации XSLT .

Как правило, в порядке применяются следующие правила (например, шаблон, исключенный из рассмотрения из-за более низкого приоритета импорта, исключается навсегда, независимо от его приоритета):

  1. Импортированные шаблоны имеют более низкий приоритет, чем шаблоны в основной таблице стилей
  2. Шаблоны с более высоким значением в атрибуте priority имеют более высокий приоритет
  3. Шаблонам без атрибута priority назначается приоритет по умолчанию. Шаблоны с более конкретными шаблонами имеют приоритет.
  4. Ошибка, если на предыдущих трех этапах оставлено несколько шаблонов для рассмотрения, но процессоры XSLT могут восстановиться, если по умолчанию используется последний из файлов.

В вашем конкретном случае оба шаблона имеют одинаковый приоритет, поэтому применяется № 4 выше. Для демонстрации:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match=
             "vehicle_details[preceding-sibling::vehicle_type = '4x4']/*">
        template1
    </xsl:template>
    <xsl:template match="vehicle_details[descendant::color = 'red']/*">
        template2
    </xsl:template>
</xsl:stylesheet>

Применяется к этому входу (оба шаблона соответствуют):

<root>
    <vehicle_type>4x4</vehicle_type>
    <vehicle_details>
        <color>red</color>
    </vehicle_details>
</root>

Вывод:

template2

Но если мы поменяем порядок шаблонов:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="vehicle_details[descendant::color = 'red']/*">
        template2
    </xsl:template>
    <xsl:template match=
             "vehicle_details[preceding-sibling::vehicle_type = '4x4']/*">
        template1
    </xsl:template>
</xsl:stylesheet>

Тогда вывод:

template1
...