2. XSLT風格表單

爲了深入理解XSLT 編程,你必須首先理解 XML,因爲 XSLT不只是負責轉換 XML 而且自身還是一種完全意義上的XML標準語言。在理論上,你完全可以編寫負責自身格式轉換的XSLT風格表單,當然這是一件滿有意思的事,只是沒啥用處。

讓我們回憶一下, XML 並不是一種通常意義上的語言,XML是一種元語言(metalanguage),也就是建立XML規範語言的結構(比如XSL和 XHTML就是XML規範語言)。HTML看起來很象XML,但實際上違反了好些 XML規則。

XML 語言定義了一套用來把數據標記爲元素(或者可以說節點)的標籤。比方說,就XHTML語法而言,<table>標籤就等於開始標記某個特定的XML節點。XML節點可以包含屬性和內容體。屬性是由字符串組成的名字/值對。內容體可以是字符串和/或更多的 XML節點。這就意味着,XML是一種層次化的結構,可以表示很複雜的數據格式。我們不妨考慮以下的一個XHTML片段:
<table>
<tr>
<td>Hello world!</td>
<td><img src="smiley.gif"/></td>
</tr>
</table>

在以上的代碼段中,每個節點都有自己的開-閉標籤,兩個標籤之間是更多的節點和文本字符串。img 節點有一個src屬性而沒有內容,緊挨着開標籤的是一個終止斜線。這個終止斜線和文本都在<td>節點內嵌套,而後者又在<tr>節點內嵌套,顯然<tr>節點則在<table>內嵌套。

XSLT 的核心思想是建立上下文環境(context),也就是在XML文檔內的特定節點或者整套節點同時輸出爲存在於這個環境內的格式化數據版本。爲此, XSLT風格表單被分解爲離散的模版,每個模版負責處理XML文檔內某類型的標籤。在這些模版內,XSLT要用到標量、傳遞參數、循環條件以及其他轉換XML的元件。

<xsl:stylesheet>元素是任何XSLT風格表單的最外層元素,你要爲其指定版本和一個或者多個名稱空間(namespace):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform>
...
</xsl:stylesheet>

你可以設置其他屬性,但是,對幾乎所有的基本風格表單來說,你可以原樣使用這些<xsl:stylesheet>標籤。其中就可以嵌套模版元素了。

XSLT模版

<xsl:template>元素定義了隨導出結果輸出而伴隨的指令上下文環境,其語法如下所示:
<xsl:template
match="expression"
name="name"
priority="number"
mode="mode">
</xsl:template>

XSLT 處理器在發現風格表單中的一個顯式調用或者在源XML文檔中發現匹配節點之後就會執行<xsl:template>。最常見的情況是當XSLT處理器掃描XML時遇到了匹配節點。匹配屬性則用Xpath表達式標識模版中取出的節點。

激活的 <xsl:template> 元素輸出其需要的內容。這些內容可能由文本和非XSLT的標記所組成並直接寫入某個新建文檔乃至更多的XSLT元素,後者則在匹配節點的上下文環境中執行。跟蹤上下文環境是不可能的。XSLT元素只處理被模版激活的同類節點。

多個模版可以匹配一個節點。在這種情況下,採用模式和優先級屬性的複雜規則確定了應由哪個模版來處理節點。最簡單的風格表單只包含了匹配給定節點的一個模版。

對那些主要包含標記文本(比如HTML)的XML文檔,你的XSLT風格表單很可能會包含你能遭遇的每個標籤的一個模版。而對那些包含高度結構化層次數據的XML文檔,你的風格表單可能只會包含頂級節點的模版。這些模版知道數據的結構並會直接訪問子節點而不是跳到其他模版。

比方說,示例XML文件包含了一個較短的標記圖書數據。它由一個<book>節點組成,而該節點則包含了<title>和多個<chapter>節點。這一模版會在頂級的<book>節點內執行每個<chapter>節點:

<xsl:template match="/book/chapter">
This is chapter <xsl:number/>, entitled "<xsl:value-of select="title"/>"
</xsl:template>

假如某個 XSLT處理器沒有針對節點或其父節點的匹配模版,它就會輸出該節點的內容,不過這樣做可能包含偏離其自身模版的子節點。 所以只處理模版的風格表單會產生以下的結果:
<?xml version="1.0" encoding="utf-8"?>
Stuff Happens
This is chapter 1, entitled "How it begins"
This is chapter 2, entitled "What transpires"
This is chapter 3, entitled "Where it ends"

顯然,<paragraph>節點被忽略了,因爲它們的<chapter> 父節點被處理了,但是第1個<title>並不在<chapter>之內所以乾脆打印了事。

發佈了10 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章