Pierwszeństwo szablonów xsl

Mam 2 Szablony

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

Moje pytanie brzmi: który szablon będzie miał pierwszeństwo przy transformacji. A może mi ktoś podać przegląd / zasoby dotyczące pierwszeństwa szablonów XSL?

Z góry dzięki!
Author: Jens, 2011-04-19

1 answers

Proces pełnej rozdzielczości jest opisany w sekcja 5.5 specyfikacji XSLT .

Ogólnie, następujące zasady mają zastosowanie w kolejności (np. szablon wyeliminowany z rozpatrzenia z powodu niższego pierwszeństwa importu jest wyeliminowany na stałe, niezależnie od jego priorytetu):

  1. zaimportowane szablony mają niższy priorytet niż szablony w głównym arkuszu stylów
  2. szablony z wyższą wartością w atrybucie priority mają wyższy priorytet
  3. Szablony bez atrybutu priority przypisany jest domyślny priorytet. Szablony z bardziej szczegółowymi wzorami mają pierwszeństwo.
  4. jest to błąd, jeśli poprzednie trzy kroki pozostawiają więcej niż jeden szablon w rozważeniu, ale procesory XSLT mogą odzyskać, domyślając się do ostatniego w pliku.

W twoim konkretnym przypadku oba szablony mają ten sam priorytet, więc stosuje się #4 powyżej. Aby wykazać:

<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>

Zastosowane do tego wejścia (oba szablony "dopasowanie": {]}

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

Wyjście:

template2

Ale jeśli zamienimy kolejność szablonów:

<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>

Następnie wyjście to:

template1
 41
Author: Wayne Burkett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-19 02:43:02