<xslTutorial creator="nicmila@idoox.com">
<index keywords='priority xsl:template'/>

<description>
Often several templates match selected element in XML source. It must be therefore decided which one to use. The templates are ordered according their priority which can be specified with priority attributte. If the template does not have this attribute, its priority is calculated according to several rules.  <stylesheet id='id2'/> and <stylesheet id='id3'/> differ by priority of their templates. <stylesheet id='id4'/> shows the default action in the absence of priority attributes.  Template CCC has lower priority than CCC/CCC, as it is less specific. Compare <stylesheet id='id5'/> and <stylesheet id='id6'/>. Template CCC  has lower priority than both CCC/CCC or AAA/CCC/CCC, but the latest two have the same priority. In such a case an XSLT processor may signal the error; if it does not signal the error, it must recover by choosing, from amongst the matching template rules that are left, the one that occurs last in the stylesheet. In <stylesheet id='id7'/>  less specific * has lower priority than CCC. Computed priorities ranges fromt -0.5 to 0.5. XSLT spec gives more details.
</description>


<xmlSource id="id1">
<AAA id='a1' pos='start'> 
      <BBB  id='b1'/> 
      <BBB  id='b2'/> 
</AAA> 
<AAA  id='a2'> 
      <BBB  id='b3'/> 
      <BBB  id='b4'/> 
      <CCC  id='c1'> 
           <CCC  id='c2'/> 
      </CCC> 
      <BBB  id='b5'> 
           <CCC  id='c3'/> 
      </BBB> 
</AAA> 
</xmlSource>

<attValues>
<value match=''></value>
</attValues>

<xslStylesheet id="id2">

<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC" priority="3">
<H3 style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>

<xsl:template match="CCC/CCC" priority="4">
<H2 style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H2>
</xsl:template>
</xslStylesheet>

<xslStylesheet id="id3">
<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC" priority="4">
<H3 style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>

<xsl:template match="CCC/CCC" priority="3">
<H2 style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H2>
</xsl:template>
</xslStylesheet>

<xslStylesheet id="id4">
<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC">
<H3 style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>

<xsl:template match="CCC/CCC">
<H2 style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H2>
</xsl:template>
</xslStylesheet>

<xslStylesheet id="id5">
<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC">
<H3 style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>

<xsl:template match="CCC/CCC">
<H2 style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H2>
</xsl:template>

<xsl:template match="AAA/CCC/CCC">
<H2 style="color:green">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H2>
</xsl:template>
</xslStylesheet>

<xslStylesheet id="id6">
<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
</xsl:template>

<xsl:template match="CCC">
<H3 style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>

<xsl:template match="AAA/CCC/CCC">
<H2 style="color:green">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H2>
</xsl:template>


<xsl:template match="CCC/CCC">
<H2 style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H2>
</xsl:template>

</xslStylesheet>

<xslStylesheet id="id7">
<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
<xsl:apply-templates select="//AAA"/>
</xsl:template>

<xsl:template match="CCC">
<H3 style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>

<xsl:template match="*">
<H3 style="color:maroon">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</H3>
</xsl:template>


</xslStylesheet>

</xslTutorial>