Ответ 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