Posted on 2006-09-24 16:02
奔跑的阿甘 閱讀(632)
評論(0) 編輯 收藏 引用 所屬分類:
XML/Data Service
XSLT淺談
Michael 2006/09/24
在"XML淺談"一章,曾提到XML文檔的內容可由XSLT經過轉化處理后呈現給用戶,今天我們著重討論如何做到這點。
掌握XSLT需要牢記以下三條法則:
1.XSLT本身就是XML文檔
2.XSLT轉化后需要顯示的內容由用戶決定
3.XSLT轉化的內容如何顯示由用戶決定
一 XSLT本身就是XML文檔
這意味著,編寫XSL文件和編寫一份普通的XML文檔沒什么區別。它需要有且僅有一個根結點,它的每個元素需要前后對稱,等等。這些XML
文檔的編寫規范就是XSL的編寫規范。
XSL文檔的根節點是<xsl:stylesheet>,一般地,所有XSL文檔的根結點描述為:
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
注意:用來定義xsl名字空間的URI地址是大小寫相關的。
以下為本章示例XML文檔book.xml:
<?xml version="1.0"?>
<?xml:stylesheet type="text/xsl" href="book.xsl"?>
<source>
<book id="001">
???? <price>USD100</price>
???? <page>1000</page>
???? <book id ="002">partII</book>
</book>
</source>
二 XSLT轉化后需要顯示的內容由用戶決定
XSLT是面向規則或者面向模板(TEMPLATE-ORIENTED)的語言,它定義一系列的針對源XML文檔節點的規則,用于替換指定的XML文檔節點
,最終生成的文檔就是用戶希望看到的內容。
所以,通過編寫適用于特定節點的規則,這些節點就根據規則定義的格式呈現出來。
如果用戶不希望看到某部分內容,只要不對這些內容節點制定規則,它們就不被顯示。
在XSLT中,<xsl:template>元素用于制定一個規則,這條規則可適用于XML樹的某個節點也可適用于多個節點,它可由元素的"match"屬
性指定。
這種T-O方法允許用戶自行定義靈活的表單生成各式各樣的效果。
例如:
<xsl:template match="/">
???? <xsl:apply-templates select="http://book"/>
</xsl:template>
上述規則的含義是:
1)經過該XSL轉化后的文檔僅包含book元素
2)該book元素可以是任一節點的book元素
三 XSLT轉化的內容如何顯示由用戶決定
如何顯示指定節點,也就是如何制定規則(TEMPLATE)的過程。
規則的內容就是如何定義樣式,它可以是HTML的元素,或者XSLT本身定義的元素(如<xsl:value-of>,<xsl:text>等)。
例如:
<xsl:template match="book">
???? <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>
上述規則的含義是:
1)這條規則對XML樹的book節點進行轉換
2)轉換后的內容顯示如下(藍色3號大小):
book (id=001)
book (id=002)
XSLT中對同一個XML節點可以定義多條規則(由mode屬性或者按優先級選擇等),同時,一條規則可以適用于多個XML節點(設置"match"
屬性時采用"|"運算符連接多個節點等)。
最后,對于XML分析器轉換XML文檔時的過程簡單總結一條:
分析器從根節點開始遍歷XML文檔,對每個節點,從XSL文檔中尋找規則,若找到則進行節點轉換,否則繼續遍歷,直到整顆樹遍歷完畢為止。在進行父節點轉換時,如果XSL也定義了該父節點的某個子節點的規則,則需要檢查是否有<xsl:apply-templates>元素,若沒有則整個父節點(包括所有子節點)都將被父節點的規則替換,若有,則需要對該元素指定的子節點或者對所有子節點采用各自的規則進行替換。
【完】