Процесс полного разрешения описан в * 5.51 * разделе 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