English | Français | Deutsch | Magyar | >> 中文 << | Polski ZVON > Tutorials > XSLT Tutorial
>> 页 11 << | 上一条 | 下一条 | 目录 | 元素索引

经常会有多个模板能匹配同一个 XML 元素。因此必须能决定使用哪个模板。这个优先级的顺序可以通过 priority 属性来给出。如果没有给出这个属性,优先级将会根据某些规则算出。 XSLT stylesheet 1XSLT stylesheet 2 的模板优先级不同。 XSLT stylesheet 3 显示了没有指定优先级时的默认行为。模板 CCC 比模板 CCC/CCC 的优先级低,因为它不如后者精确。比较 XSLT stylesheet 4XSLT stylesheet 5 。模板 CCC 的优先级比 CCC/CCC 或者 AAA/CCC/CCC 都低,但是后两个的优先级却是相同的。这时 XSLT 处理器可能会发出出错信号,如果没有信号,处理器一定是使用了剩下的模板中最后一个在样式表中出现的模板。在 XSLT stylesheet 6 中,更不精确的 "*" 比 CCC 模板的优先级更低。算出来的优先级会在 -0.5 到 0.5 之间分布。XSLT 规范中对此有更详细的说明。

XSLT stylesheet 1

XML源码
<source>

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

</source>

输出
<h3 style="color:blue">CCC (id=c1)</h3>
<h2 style="color:red">CCC (id=c2)</h2>
<h3 style="color:blue">CCC (id=c3)</h3>

用HTML察看

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)

XSLT stylesheet
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

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


</xsl:stylesheet>


XSLT stylesheet 2

XML源码
<source>

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

</source>

输出
<h3 style="color:blue">CCC (id=c1)</h3>
<h3 style="color:blue">CCC (id=c2)</h3>
<h3 style="color:blue">CCC (id=c3)</h3>

用HTML察看

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)

XSLT stylesheet
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

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


</xsl:stylesheet>


XSLT stylesheet 3

XML源码
<source>

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

</source>

输出
<h3 style="color:blue">CCC (id=c1)</h3>
<h2 style="color:red">CCC (id=c2)</h2>
<h3 style="color:blue">CCC (id=c3)</h3>

用HTML察看

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)

XSLT stylesheet
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

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


XSLT stylesheet 4

XML源码
<source>

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

</source>

输出
<h3 style="color:blue">CCC (id=c1)</h3>
<h2 style="color:green">CCC (id=c2)</h2>
<h3 style="color:blue">CCC (id=c3)</h3>

用HTML察看

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)

XSLT stylesheet
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

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


</xsl:stylesheet>


XSLT stylesheet 5

XML源码
<source>

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

</source>

输出
<h3 style="color:blue">CCC (id=c1)</h3>
<h2 style="color:red">CCC (id=c2)</h2>
<h3 style="color:blue">CCC (id=c3)</h3>

用HTML察看

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)

XSLT stylesheet
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

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


</xsl:stylesheet>


XSLT stylesheet 6

XML源码
<source>

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

</source>

输出
<h3 style="color:blue">CCC (id=c1)</h3>
<h3 style="color:blue">CCC (id=c2)</h3>
<h3 style="color:blue">CCC (id=c3)</h3>
<h3 style="color:maroon">AAA (id=a1)</h3>
<h3 style="color:maroon">AAA (id=a2)</h3>

用HTML察看

CCC (id=c1)

CCC (id=c2)

CCC (id=c3)

AAA (id=a1)

AAA (id=a2)

XSLT stylesheet
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

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


</xsl:stylesheet>