舉個例子說,假如你想找到所有的lowfat hamburger price元素。為了用標准的DOM API來完成這一切,你必須通過手工地書寫代碼遍歷整顆樹來找尋符合條件的元素(在本例中,條件是指在hanburger元素中lowfat=yes的price元素)。再看另一個例子,假設你想將所用的hamburger元素和相關的數據轉換為簡單的HTML表格以供用戶交互使用。使用標准的DOM API,你得手工遍歷整棵樹來獲得HTML表格中所需的數據。
我為了標准化及簡化人們完成這些任務所需做的工作,W3C推薦使用XSL(Extensible Stylesheet Language)和一種叫做XSL Patterns的簡單查詢語言。
XSL Patterns
一個模式就是一個字符串,通過它來選取XML樹中的節點。這樣的選取取決於模式所關連的當前節點。元素的名字是最簡單的模式,這個模式選取了當前節點所有具有該名字的子節點。例如,hamburger模式選取了當前節點的所有hamburger子節點。
模式的語法非常完備。它允許你標識某個指定元素在文檔中所處的上下文(例如,price元素在hamburger元素之中),同時它還提供了強大的篩選句法,使得我們可以標識出符合給定條件的節點(例如,lowfat=yes)。為了找出一個hamburgers元素中的所有lowfat hamburger price元素,你可以使用以下的模式字符串:
/hamburgers/hamburger[@lowfat="yes"]/price
當某個模式被應用於給定的節點時,它僅返回符合指定模式的節點列表。這大大簡化了開發者的操作,不再需要遍歷整棵樹。
MSXML 2.0對模式語法的支持和Extensible Stylesheet Language (December 18th Working Draft)中2.6節的定義是相同的。MSXML 2.0中的IXMLDOMNode接口提供了兩個方法,SelectNodes和SelectSingleNode。這兩個方法都以一個模式串為參數。例如,下面的一行代碼將返回滿足條件的所有price節點。
Set nodeList = rootNode.selectNodes("hamburger[@lowfat="yes"]/price")
XSL
XSL模式可以幫助我們標識一篇給定XML文檔中的某些節點,但對這些節點的操作最終還是有賴於開發者來完成。XSL可以幫助我們簡化完成通常XML任務的過程:將XML節點從一種格式轉化到另一種格式。這種對格式轉化的需求起源於Web開發者需要將他們的XML數據轉化為HTML數據以供用戶浏覽。
實際上,XSL所能做得遠比以上描述多得多。XSL能夠有效的定義從一種XML格式到另一種XML格式之間的轉換,這極大的增強了互操作性。假如某個人向你的系統發送了一篇XML文檔,而你的系統不認識它所采用的XML詞匯,你只要進行一次簡單的XSL轉換就可以得到自己熟悉的詞匯。正是由於XML這種簡單的特點,開發者才不用為了描述某種類型的數據而采用通用的詞匯。
一個XSL文件中包含了一系列定義轉換規則的聲明模板。每一個模板都明確定義了怎樣將源文檔中的指定節點轉換為輸出文檔中的節點(或其它類型的數據)的方法。你可以使用XSL模式來決定一個模板應用於一篇文檔中的那些部分。
作為一個示例,下面轉換hamburger XML文件:
<?xml version="1.0"?>
<hamburgers>
<hamburger lowfat="dream on">
<name>CowBurger</name>
<description>Greasy and good.</description>
<price>2.99</price>
</hamburger>
</hamburgers>
轉換到HTML文件:
<html>
<body>
<h1>hamburgers</h1>
<ol>
<li>CowBurger, $2.99, Greasy and good.</li>
</ol>
</body>
</html>
你使用的XSL文件如下:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" http://www.w3.org/TR/WD-xsl ">
<xsl:template match="/">
<html>
<body>
<h1>hamburgers</h1>
<xsl:for-each select="hamburgers[@lowfat="dream on"]>
<li><xsl:value-of select="name"/>, <xsl:value-of select="price"/>,
<xsl:value-of select="description"/></li>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
注意到了嗎,我們是怎樣在不同XSL元素的match和select屬性中使用XSL模式來標識元素集的?在<xsl:template>標簽中定義了一組節點的轉換規則。XSL使用了一套標准的XML詞匯來定義轉換的過程,是不是很有趣呢?
鏈接技術
很多人都認為,HTML真正強勁的地方在於它的錨元素。
<A HREF = "http://www.someserver.c