Подтвердить что ты не робот

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

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

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

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

Спасибо заранее!

4b9b3361

Ответ 1

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

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

  • Импортированные шаблоны имеют более низкий приоритет, чем шаблоны в основной таблице стилей
  • Шаблоны с более высоким значением в своем атрибуте priority имеют более высокий приоритет
  • Шаблонам без атрибута priority присваивается приоритет по умолчанию. Шаблоны с более конкретными шаблонами имеют приоритет.
  • Это ошибка, если предыдущие три шага оставляют более одного шаблона, но процессоры 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