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


