XSL語法介紹

2021-04-13 07:57:33 字數 4730 閱讀 8350

首先注意到的是,xsl檔案本身即是乙份 xml檔案,所以在xsl檔案的開頭,一樣有和xml檔案相同的宣告。w3c這個xml的標準機構為xsl定義了很多標記(元素),xsl檔案就是這些標記和html標記的組合。在xsl檔案中,必須有如下一行的**: 

> 這裡,xsl:stylesheet是xsl檔案的根元素,在根元素中包含了所有的排版樣式,樣式表就是由這些排版樣式組合成的;xmlns:xsl="http://www.w3.org/tr/wd-xsl"

這一句主要用來說明該xsl樣式表是使用w3c所制定的xsl,設定值就是xsl規範所在的url位址。 

實際上,這裡"http://www.w3.org/tr/wd-xsl"

就是乙個名字空間(namespace),我們在上面關於xml schema語法介紹的時候已經進行過介紹。這是乙個標準的名字空間。"stylesheet","template","for-each"等等關鍵字都是這個名字空間所定義的。 

當然在xsl:stylesheet還可以設定其他的屬性,其他的屬性有: 

1. default-space:決定是否保留xml檔案中的空白,僅當值為"default"時保留。  

2. indent-result:決定是否保留xsl檔案中的空白,值為"yes"時保留。  

3. language:設定在xsl檔案中使用的指令碼語言。 

然後,我們在上面的**中看到有如下的**: 

<xsl:template match="/"> 

……… 

</xsl:template> 

這裡實際上是表示了xsl解析器對xml文件的處理過程,它從根節點(由match="/"決定,這裡"/"就表示根節點)開始,對xml文件進行遍歷,並根據具體的**從xml文件中取出相關的內容。這裡關於屬性match的取值是乙個比較複雜的問題。它實際上表示的含義是從xml文件中取出乙個特定的節點集合(xml文件可以被看成乙個樹的結構,這個在後面關於xml解析器分析中有詳細的介紹)。這裡,我們通過幾個簡單的例子來說明屬性match的取值。 

比如下面一行**: 

<xsl:template match="/"> 

這行**的意思是告訴xsl解析程式,當前需要處理的節點是根節點下的內容(用"/"來表示根節點),其實這裡的match值內容的編寫是要符合xpath的語意。關於xpath我們在後面的章節中會進行詳細的介紹。 

再舉乙個例子: 

<xsl:template match="shoppingcart/item"> 

這行**要匹配的是shoppingcart元素下的item元素。而不管shoppingcart在xml文件結構樹下的哪乙個位置。比如xml文件的其中一段是這樣的。 

<shoppingcart> 

<item> 

<itemno>3333</itemno> 

<itemname>屠龍刀</itemname> 

</item> 

<item> 

<itemno>4444</itemno> 

<itemname>離別鉤</itemname> 

</item> 

</shoppingcart> 

那麼它匹配的內容就是 

<item> 

<itemno>3333</itemno> 

<itemname>屠龍刀</itemname> 

</item> 

<item> 

<itemno>4444</itemno> 

<itemname>離別鉤</itemname> 

</item> 

而下面這個例子: 

<xsl:template match="/shoppingcart/item"> 

表示只匹配xml文件根節點下的shoppingcart這個節點下的所有item元素。也就是說如果shoppingcart不是直接在根節點下的,它就不符合這個匹配條件。 

再看乙個例子: 

<xsl:template match="price[@unit='usd']"> 

這個例子說明要匹配的是這樣的節點:乙個帶unit屬性的元素price,而且unit的值必須為"usd"。比如一段xml**是這樣的。 

<price> 

<unit>usd</unit> 

<amount>100</amount> 

</price> 

<price> 

<unit>rmb</unit> 

<amount>300</amount> 

</price> 

那麼它匹配的內容就是: 

<price> 

<unit>usd</unit> 

<amount>100</amount> 

</price> 

實際上,存在許多各種符號用來表示匹配規則,我們在xpath語法介紹中會詳細涉及到。現在知道這麼乙個大概的概念就可以了。 

我們用<xsl:template match="具體匹配表示式">這條語句找到了一些節點集合以後,我們就要從這個集合中找到特定的元素或者元素屬性的值,那麼採用什麼語句呢?就是用xsl:value-of select = ""這樣的語句來尋找特定的內容。 

比如下面的例子中<xsl:value-of select="名稱"/>這行**就是表示定位xml文件中的名稱元素的內容。在指定集合中可能存在多個名字元素,如果我們需要把它們一一枚舉出來進行處理的話,就需要用到語句xsl:for-each select = "",注意這裡涉及到乙個作用範圍的概念,也就是說xsl:for-each select = ""這條語句是在乙個指定的集合空間中執行的。比如上面例子中如下的** 

這裡的<xsl:for-each select="詞語">是在<xsl:template match="網路用語集合">所指定的集合空間裡面尋找元素"詞語"的。 

同時,我們需要注意的是上面的**中,出現了一條語句 

它表示什麼意思呢,它實際上相當於c++中的乙個過程呼叫,當xsl解析器執行到該語句的時候,它就會在**中尋找以<?xml:namespace prefix = xsl /><xsl:template match="網路用語集合">開頭的**,所以在上面的例子程式中,以下的**可以看成是過程的實現。 

把看成是乙個過程呼叫,把<xsl:template match="網路用語集合">  

……. 

</xsl:template> 

看成是過程的實現,有助於我們對xsl解析器執行過程的理解。這裡match="網路用語集合"可以理解為是傳遞給過程的引數,它表示過程實現體的集合範圍是該match所匹配的節點集合空間("網路用語集合")。 

如果我們要對**中的元素進行排序該什麼辦呢?比如說,在上面的例子中,我們需要按照名稱進行排序。很簡單對,改寫為如下的形式即可: 

<xsl:for-each select="詞語" order-by="+名稱">,其中"+"表示按降序排列;"-"表示按公升序排列。"order-by"是xsl語法中的關鍵字。 

如果我們只想在列表中取出某幾行該怎麼操作呢?比如我們只想取出名稱為"恐龍"的行,見下面的**: 

這裡有乙個新的句法為:<xsl:template match="網路用語集合">  

<table border="1"> 

<xsl:for-each select="詞語" order-by="-名稱"> 

<xsl:if test=".[名稱='恐龍']"> 

<tr> 

<td><xsl:value-of select="名稱"/></td> 

<td><xsl:value-of select="含義"/></td> 

</xsl:if> 

</xsl:for-each>  

</table> 

</xsl:template> 

它表示如果".[名稱='恐龍']"為真(true)的話,就執行該段裡面的語句,要是為假(false)的話就不執行。它和c++中的if語句的概念基本是一樣的。 

前面我們用<xsl:value-of select=""/>取出的都是乙個元素的值,但是我們要取出元素某乙個屬性的值該怎麼做呢?採用下面的形式: 

<xsl:value-of select="元素名稱/@屬性名稱"/> 

比如一段xml**是這樣的: 

<王朔 **="www.wangshuo.com

我們可以用<xsl:value-of select="王朔/@**"/>來得到值"www.wangshuo.com

"。 以上包括了xsl的大多數基本的語法,更加詳細和完整的介紹需要參看w3c相關的最新的文件,可以www.w3c.org/tr

下找到。 

根據上面的分析,我們可以看到xsl實際上採用的是一種轉換的思想,它最終將xml文件轉換為另一種可用於輸出的文件,而css則沒有任何轉換動作,在整個過程中沒有任何新碼產生。 另外,在xsl中90%的樣式規定在css中都有定義,但仍然有一些效果是css無法描述的,必須使用xsl不可。這些功能包括文字的置換、根據文字內容決定顯示方式、文件內容排序等,都是xsl所獨有的。再者,xsl遵從xml的語法,而css的語法自成體系。  

選擇樣式單還要考慮不同瀏覽器對樣式單的支援程度。目前ie5與netscape的最新版本都支援css,但支援的程度都有限。至今為止,ie5尚不能完全支援css1,即便是支援的部分也存在很多錯誤,對於css2也只提供部分支援。netscape在對css的支援上已經優於ie5,它採用新一代的raptor/gecko引擎技術,已經能夠完全支援css1,但對css2的支援計畫尚不明朗。而對xslt而言,只有ie5支援,netscape5並不支援。 

XSL函式介紹 4

方法,即可用於 xsl元素 xsl for each xsl value of xsl template 的select屬性 xsl if xsl when 的test屬性中,對元素的範圍進行篩選,從而提供更大的靈活性。xml與dhtml 動態html 一樣,這些節點都是乙個個物件,而且這些物件都是...

XSL函式介紹 1

對於vbscript jscript增加的方法 屬性,以充分發揮xml的優勢,用於 xsl script xsl eval 標記內表示式的編寫或 xsl if xsl when 的expr屬性。一 absolutechildnumber 含義 返回結點相對於它所有的兄弟 不論名字是否相同 的序號 語...

XSL函式介紹 4

方法,即可用於 xsl元素 xsl for each xsl value of xsl template 的select屬性 xsl if xsl when 的test屬性中,對元素的範圍進行篩選,從而提供更大的靈活性。xml與dhtml 動態html 一樣,這些節點都是乙個個物件,而且這些物件都是...