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>
<?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>
<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>
<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: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節點,所以第三個模板規則將匹配三次。
注意:避免死迴圈。