XSL學習筆記2  XSLT的模板規則<xsl:template>和<xsl:apply-templates>
 
XSL樣式表是由一個或多個被稱為“模板” 的規則集組成的。每個模板都包含了與每一個指定節點相匹配的應用規則。
 
模板規則包含兩個部分:模式(pattern)和模板(template)。
模板用於在源文件中匹配(定位)節點,模板定義節點的處理規則,通過模板的例項化來組成結果樹的一部分。
 
當一個模板例項化的時候,它總是相對於當前節點和當前節點列表來例項化。當前節點總是當前節點列表的成員。在XSLT中,大多數操作都是相對於當前節點的。只有很少的指令改變當前節點列表或者當前節點(例如:<xsl:for-each>指令)。
 
當XSLT處理器使用XSL式樣錶轉換XML文件時,處理器將遍歷XML文件的樹狀結構,一次瀏覽每個節點,並將瀏覽的節點與式樣表中的每個模板規則的模式進行比較。如果處理器找到了與模板規則的模式相匹配的節點,處理器就會輸出此規則的模板。模板通常包含了一些元素指令、新的資料,或者從源XML文件中複製的資料。
 
<xsl:template> 元素
 
<xsl:template> 元素定義了用於匹配節點的規則(match,其中”/”匹配整個文件),在apply-template使用
 
語法規則為:
 
<xsl:template
name=”name”
match=”pattern”
mode=”mode”
priority=”number”> 
<!– Content:(<xsl:param>*,template) –>
</xsl:template>
 
  其中:
  name 模板名稱
  match Xpath語句,指定條件
  mode模式,例如紅,藍等樣式
  priority 指定模板的優先順序,為數字。
 
如果每個模板都賦予了優先順序,則處理器可以使用這個值來確定哪個模板具有最高優先順序。如果沒有顯式指定優先順序,則處理器會為模板計算一個預設值。由處理器指定的預設優先順序範圍是從 -0.5 到 +0.5。基本上,模式越特殊,其預設優先順序就越高。由於範圍是從 -0.5 到 +0.5,因此如果顯式指定一個模板的優先順序為 1,就總會超過預設優先順序。
 
當一個節點匹配在 XSLT 模板中建立的多個模式(也稱為規則)時,處理器就會按照 XSLT 規範中描述的衝突解決指導原則來確定使用哪一個模式。這些指導原則表明,當發生衝突時,會呼叫優先順序最高的模板。然而,確定模板實際優先順序的演算法還需要附帶解釋一下。
 
要確定哪個模板具有最高優先順序,處理器首先會消除匯入的所有模板(使用 xsl:import 元素);自動匯入的模板比經過匯入轉換的模板優先順序低。然後處理器確定其餘模板的優先順序值。
 
當出現衝突時,XSLT 需要經過大量處理才能確定呼叫哪個模板。
 
 
Match 屬性的作用是使模板和XML與元素相匹配。Match屬性也可以為整個XML文件定義模版。Match屬性值是一個XPath表示式。(例如:match=”/” 定義整個文件)。
 
employee.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<?xml-stylesheet type=”text/xsl” href=”src/employees44.xsl”?>
<employees>
    <employee sn=”E-200402100001″>
        <name>zhangsan</name>
        <age>25</age>
        <monthly_pay mode=”cash”>
            1200.00
        </monthly_pay>
    </employee>
    <employee sn=”E-200402100006″>
        <name>lisi</name>
        <age>28</age>
        <monthly_pay mode=”cash”>
            1600.00
        </monthly_pay>
    </employee>
    <employee sn=”E-200503220001″>
        <name>wangwu</name>
        <age>30</age>
        <monthly_pay mode=”credit_card”>
            3500.00
        </monthly_pay>
    </employee>
</employees>
 
employee.xsl
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>
    <xsl:template match=”/”>
        <html>
            <head>
                <title>employees info</title>
            </head>
        </html>
    </xsl:template>
</xsl:stylesheet>
 
這個是生成的html程式碼:
<html>
<head>
<META http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<title>employees info</title>
</head>
</html>
 
<xsl:template>元素是用於建立模板的。
 
<?xml version=”1.0″ encoding=”ISO-8859-1″?>.
因為XSL樣式表就是XML文件本身,所以它一般都從XML開始宣告:<?xml version=”1.0″ encoding=”ISO-8 59-1″?>。
 
<xsl:stylesheet>,把這份文件定義為XSLT樣式表文件(連同版本號和XSLT名稱空間屬性一起定義)。
 
<xsl:template>元素定義了一份模板。Match=”/”屬性使模板和XML源文件的根目錄相互聯結起來。
Match 屬性的作用是使模板和XML與元素相匹配。Match屬性也可以為整個XML文件定義模版。Match屬性值是一個XPath表示式。(例如:match=”/” 定義整個文件)。<xsl:template>元素裡面的內容定義一些HTML來對結果進行書寫。
 
<xsl:apply-templates>元素
 
<xsl:apply-templates>元素用於告訴處理器處理當前節點的所有子節點。在匹配的節點模板中還可以再包含<xsl:apply-templates>元素,從而通知處理器處理該節點的所有子節點,這樣依次呼叫,就可以完成對文件樹中所有節點處理。
 
<?xml version=”1.0″?>
<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>

    <xsl:template match=”/”>
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match=”employees”>
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match=”employee”>
        <xsl:apply-templates select=”name”/>
    </xsl:template>
    
</xsl:stylesheet>

 
以上XSL文件定義了三個模板規則:
1、<xsl:template match=”/”>這個模板匹配XML文件的根節點,告訴處理器處理根節點的所有位元組點。
 
2、<xsl:template match=”employees”> 這個模板匹配employees節點,告訴處理器處理employees節點的所有位元組點。
 
3、最後這個模板複雜些:
<xsl:template match=”employee”>
        <xsl:apply-templates select=”name”/>
    </xsl:template>
<xsl:template match=”employee”>
 
<xsl:template match=”employee”>這個模板匹配employee節點,告訴處理器處理employee節點的所有位元組點。
select=”name”,select屬性告訴處理器只處理employee節點下的name子節點。
由於employees節點下有三個employee節點,所以第三個模板規則將匹配三次。
 
注意:避免死迴圈。