天天看點

XSLT快速參考

1 前言

我們用一個簡單的XSLT樣式表作為例子介紹了XSLT的概要。當然,XSLT所擁有的元素并不僅限于xsl:template、xsl:apply-templates、xsl:value-of。為了實行轉換,XSLT準備了各種各樣的元素。本章将以最常用的元素為中心舉例說明。

另外,本文中并不準備介紹元素的全部屬性。詳情請參見W3C标準的原文[1]及譯文[2]等。

在XSLT中經常會用到一種被稱為XPath的描述方法。首先從XPath的概要開始介紹。

2 XPath是什麼?

XPath是樹結構的一種描述方法。在建立XSL樣式表時經常使用XPath。

2.1 樹結構

XML文檔表示的資料組成數結構。用XLST進行轉換,也就是從源文檔的樹(源樹)生成轉換後的樹(目标樹)的意思。這個轉換以樹結構的節點為基礎來進行。

節點有幾種,主要為:

  • 表示根的“根節點”
  • 表示元素的“元素節點”
  • 表示屬性的“屬性節點”
  • 表示文本的“文本節點”
  • 表示注釋的“注釋節點”

使用像這樣的各種各樣的節點來表示樹的位置的描述方法稱為XPath。

2.2 XPath表達式

建立XSLT樣式表時經常使用的XPath表達式如表1所示。所謂的上下文節點,就是由上下文構成的節點,可以了解為“處理對象”。另外,今後會出現“目前節點”的概念,可以了解為“被選中的節點”。 ​​​1​​​​1​​

表1: 常用的XPath表達式

記号 含義
a 上下文節點的a元素
* 上下文節點的所有元素
a/b 以上下文節點的a元素為父節點的b元素
a//b 以上下文節點的a元素為祖先的b元素
a|b 上下文節點的a元素和b元素
a[表達式] 符合表達式的上下文節點的a元素
. 上下文節點
.. 上下文節點的父節點
/ 根節點
@a 上下文節點的a屬性
@* 上下文節點的所有屬性
node() 所有節點
text() 文本節點

描述類似于UNIX的路徑描述。例如,

​<html> <body> <a href="sample.html">示例</a> <ul> <li>項目A</li> <li>項目B</li> </ul> </body> </html>​

中,表示元素a的XPath表達式為

​/html/body/a ​

此外,若表示a元素的href屬性,則為

​/html/body/a/@href ​

表中a[表達式]是符合表達式的a項目的意思,例如表示第一個li項目時使用

​/html/body/ul/li[1] ​

3 定義樣式表的元素

XSLT樣式表使用XML文檔的格式建立。是以,必須要遵從XML文檔的描述規則。XML文檔中必須存在的元素隻有根元素。在XSLT樣式表中的根元素就是xsl:stylesheet元素。基本代碼如下所示:

​<xsl:stylesheet version = "版本号"> <!-- 内容: (xsl:import*, 頂層元素) --> </xsl:stylesheet>​

4 模闆規則

XSLT樣式表可以說是模闆規則的集合。

4.1 模闆規則的定義

模闆規則使用xsl:template元素進行定義。它的屬性包括match、name、priority和mode。其中最重要的是match屬性,該屬性規定了節點的樣式。若沒有指定name屬性的話,就必須指定match屬性。基本的代碼如下所示。

​<xsl:template match = "樣式" name = "名稱"> <!-- 内容: (xsl:param*, 模闆) --> </xsl:template>​

name屬性将在調用命名模闆時使用。關于命名模版将在後面講述。

4.2 應用模闆規則

我們使用xsl:apply-template元素來應用模闆規則。它包含select和mode屬性。基本的代碼如下所示:

​<xsl:apply-templates select = "節點集合表達式"> <!-- 内容: (xsl:sort | xsl:with-param)* --> </xsl:apply-templates>​

後面将講到的排序操作等之外的情況下該元素不需要内容,是以空元素标記可以寫成以下的形式:

​<xsl:apply-templates select="節點集合表達式"/>​

未指定select屬性時,目前節點為所有的子節點。

通常,僅在處理目前節點的子孫節點時使用該元素。這樣就不會發生無法終了的無限循環。不能定義如下例所示的無限循環模版:

​<xsl:template match="x"> <xsl:apply-templates select="."/> </xsl:template>​

4.3 命名模版

帶有name屬性的模闆規則可以通過模版名稱來調用。

​<xsl:call-template name = "名稱"> <!-- 内容: xsl:with-param* --> </xsl:call-template>​

例如,定義下例所示的模闆規則時,

​<xsl:template name="hello"> 你好 </xsl:template>​

可以以下面的方式調用:

​<xsl:call-template name="hello"/>​

輸出為:

​你好​

4.4 比對沖突

某個指定的表達式可能會出現多個比對結果。這時根據優先度來決定應用哪個模闆。定義模闆規則時可通過設定priority屬性來顯式地指定模闆優先度。如未指定,将采用預設優先度。關于預設優先度的計算方法請參見參考文獻[1]。一般來說限制性強的表達式優先度較高。例如“a”的優先度要高于“*”。

4.5 内嵌模版規則

内嵌模闆規則即為預設模闆規則,不比對任何模闆規則的節點将由它來處理。這種機制保證了即使在不定義任何模闆規則的情況下,模版處理也能遞歸地進行下去。

應用于元素節點和根節點的内嵌模闆規則如下所示。

​<xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template>​

應用于文本節點和屬性節點的内嵌模闆規則如下所示。

​<xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template>​

對于其他節點(如注釋節點等)不做任何處理。

這種模闆規則将把文本節點内容全部輸出。将代碼1所示的XSLT樣式表應用到某個XML文檔上之後,将生成以doc為根節點、文本節點為内容的XML文檔。

代碼1: builtin.xsl

​<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <doc> <xsl:apply-templates/> </doc> </xsl:template> </xsl:stylesheet>​

5 輸出

雖然稱為“輸出”,但實際的意思是“生成目标樹的節點”。可以使用源樹生成節點,也可以直接生成節點。

5.1 取出文本

xsl:value-of元素可以将指定的節點的值作為字元串來輸出。必須要指定select屬性。

​<xsl:value-of select = "字元串表達式"/>​

指定的樹種包含其它元素時,文本節點以外的節點将被忽略,僅輸出文本。例如,

​<p>.com時代的<b>IT</b>雜志</p>​

對該樹應用

​<xsl:value-of select="p"/>​

時,輸出為

​.com時代的IT雜志​

選擇目前節點可以使用“.”。若将

​<a href="http://www.gihyo.co.jp"> 技術評論公司</a>​

作為目前節點,那麼

​<xsl:value-of select="."/>的URL是 <xsl:value-of select="@href"/>。​

的輸出為

​技術評論公司的URL是 http://www.gihyo.co.jp。​

5.2 節點複制

xsl:value-of元素将節點的值轉換為字元串。與此相對,xsl:copy-of元素将複制節點,節點中包含的子元素原封不動。基本的代碼如下所示。

​<xsl:copy-of select = "表達式"/>​

例如、

​<p>.com時代的<b>IT</b>雜志</p>​

對此應用

​<xsl:copy-of select="p"/>​

的話,輸出為

​<p>.com時代的<b>IT</b>雜志</p>​

5.3 屬性值模闆

需要生成屬性值時,可以使用大括号{}将表達式括起來。​​​2​​​​2​​。

例如,想由

​<link> <title>技術評論公司</title> <url>http://www.gihyo.co.jp/</url> </link>​

生成如下的HTML連結時,

​<a href="http://www.gihyo.co.jp/"> 技術評論公司 </a>​

可以定義如下的模闆規則。

​<xsl:template match="link"> <a href="{url}"> <xsl:value-of select="title"/> </a> </xsl:template>​

5.4 生成文本

xsl:text元素可以生成文本節點。由于生成文本時直接将文本寫出即可,是以一般情況下該元素不使用。但是若需要令輸出的轉義字元失效的話就需要使用該元素。基本代碼如下所示。

​<xsl:text disable-output-escaping = "yes" | "no"> <!-- 内容: #PCDATA --> </xsl:text>​

通過disable-output-escaping屬性可以指定輸出轉義字元是否無效。預設值是no。指定為on時,

​<xsl:text disable-output-escaping="yes"> &lt; </xsl:text>​

的輸出為

​<​

5.5 生成注釋

需要生成注釋時可以使用xsl:comment元素。

​<xsl:commwnt>這裡是注釋。</xsl:comment>​

的輸出如下所示。

​<!--這裡是注釋。-->​

5.6 複制

複制目前節點可以使用xsl:copy元素。屬性和子節點不會被自動複制。基本代碼如下所示。

​<xsl:copy> <!-- 内容:模闆 --> </xsl:copy>​

例如,将沒有屬性的上下文元素屬性原樣輸出,可以使用如下的模闆規則。

​<xsl:template match="content"> <xsl:copy> <xsl:value-of select="."/> </xsl:copy> </xsl:template>​

若需要遞歸地複制所有節點,可以使用如下的模闆規則。

​<xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template>​

5.7 生成元素

需要生成元素時可以使用xsl:element元素。通常,隻要将需要生成的元素直接寫出即可,不必使用xsl:element元素。該元素僅在需要動态生成元素時才有必要使用。基本代碼如下所示。

​<xsl:element name = "生成元素的名稱"> <!-- 内容: 模闆 --> </xsl:element>​

例如,若要由

​<heading> <text>這是标題。</text> <size>2</size> </heading>​

生成HTML标題(h元素),則可以使用如下的模闆規則。

​<xsl:template match="heading"> <xsl:element name="{concat('h', size)}"> <xsl:value-of select="text"/> </xsl:element> </xsl:template>​

concat()是字元串連接配接函數。從size元素中取出值并将其連接配接在“h”之後構成元素名。輸出如下所示。

​<h2>這是标題。</h2>​

5.8 生成屬性

需要生成屬性時可以使用xsl:attribute元素。與生成元素的情況相同,通常隻需要将需要生成的屬性直接寫出即可,不需使用xsl:attribute元素。該元素僅在需要動态生成屬性等場合才有必要使用。基本代碼如下所示。

​<xsl:attribute name = "生成屬性的名稱"> <!-- 内容:模闆 --> </xsl:attribute>​

例如

​​3​​

​​3​​ ,若想由

​<link> <title>技術評論公司</title> <url>http://www.gihyo.co.jp/</url> </link>​

生成如下的HTML連結時,

​<a href="http://www.gihyo.co.jp/"> 技術評論社 </a>​

可以定義如下的模闆規則。

​<xsl:template match="link"> <a> <xsl:attribute name="href"> <xsl:value-of select="url"/> </xsl:attribute> <xsl:value-of select="title"/> </a> </xsl:template>​

5.9 添加編号

需要輸出整數值時可以使用xsl:number元素。基本代碼如下所示。

​<xsl:number level = "源樹的級别" count = "表達式" from = "表達式" value = "數值表達式" format = "表示格式的字元串" />​

首先看看最簡單的例子。

​<items> <item>A</item> <item>D</item> <item>B</item> <item>C</item> </items>​

對該XML文檔定義如下的模闆規則。

​<xsl:template match="items"> <xsl:copy> <xsl:apply-templates select="item"/> </xsl:copy> </xsl:template> <xsl:template match="item"> <xsl:copy> <xsl:number/> <xsl:text> </xsl:text> <xsl:value-of select="."/> </xsl:copy> </xsl:template>​

生成結果如下所示。

​<items> <item>1 A</item> <item>2 D</item> <item>3 B</item> <item>4 C</item> </items>​

省略value屬性時,則根據源樹内目前節點的位置來輸出數值。由于這個原因,若使用後面将要講到的排序元素的話,即如果定義如下所示的模闆規則的話,

​<xsl:template match="items"> <xsl:copy> <xsl:for-each select="item"> <xsl:sort select="."/> <xsl:copy> <xsl:number/> <xsl:text> </xsl:text> <xsl:value-of select="."/> </xsl:copy> </xsl:for-each> </xsl:copy> </xsl:template>​

輸出結果将如下所示。

​<items> <item>1 A</item> <item>3 B</item> <item>4 C</item> <item>2 D</item> </items>​

需要按照排序結果的順序來添加編号的話,則須按照如下方式指定value屬性。position()函數傳回正在處理的上下文節點的位置。

​<xsl:number value="position()"/>​

可以使用level屬性、count屬性、from屬性來控制編号方法。count屬性設定應當被編号的節點。level屬性設定作為編号對象的源樹的級别。可指定的級别有single、multiple、any三種,預設值為single。

例如,有下面這種層次結構的XML文檔。

​<chapter title="第一章"> <section title="第一節"> <subsection title="第一部分"> </subsection> </section> <section title="第二節"> <subsection title="第二部分"> </subsection> <subsection title="第三部分"> </subsection> </section> </chapter>​

将xsl:number元素的level屬性設定為single,即将如下的模闆規則應用于該文檔,

​<xsl:template match="chapter|section|subsection"> <xsl:apply-templates select="@title"/> <xsl:apply-templates select="*"/> </xsl:template> <xsl:template match="@title"> <xsl:number level="single" count="chapter|section|subsection"/> <xsl:text> </xsl:text> <xsl:value-of select="."/><br/> </xsl:template>​

轉換結果如下所示。

​1 第一章<br/> 1 第一節<br/> 1 第一部分<br/> 2 第二節<br/> 1 第二部分<br/> 2 第三部分<br/>​

也就是輸出在兄弟節點中目前節點的位置。設定level屬性為multiple時,轉換結果如下所示。

​1 第一章<br/> 1.1 第一節<br/> 1.1.1 第一部分<br/> 1.2 第二節<br/> 1.2.1 第二部分<br/> 1.2.2 第三部分<br/>​

編号與single相同,但是增加了父節點的編号。設定level屬性為any時,轉換結果如下所示。

​1 第一章<br/> 2 第一節<br/> 3 第一部分<br/> 4 第二節<br/> 5 第二部分<br/> 6 第三部分<br/>​

也就是按照符合count指定的表達式的節點的順序輸出序号。

from屬性設定計數開始的位置。例如,考慮如下的XML文檔。從邏輯上看,各個節點之間有父子關系,但是在源樹中各個節點是并列關系。

​<h1>大标題一</h1> <h2>中标題一</h2> <h3>小标題一</h3> <h2>中标題二</h2> <h3>小标題二</h3> <h3>小标題三</h3>​

下面使用from屬性設定計數開始的節點。

​<xsl:template match="h1"> <xsl:number/> <xsl:text> </xsl:text> <xsl:value-of select="."/><br/> </xsl:template> <xsl:template match="h2"> <xsl:number level="any" count="h1"/> <xsl:text>.</xsl:text> <xsl:number level="any" from="h1" count="h2"/> <xsl:text> </xsl:text> <xsl:value-of select="."/><br/> </xsl:template> <xsl:template match="h3"> <xsl:number level="any" count="h1"/> <xsl:text>.</xsl:text> <xsl:number level="any" from="h1" count="h2"/> <xsl:text>.</xsl:text> <xsl:number level="any" from="h2" count="h3"/> <xsl:text> </xsl:text> <xsl:value-of select="."/><br/> </xsl:template>​

轉換結果如下所示。

​1 大标題一<br/> 1.1 中标題一<br/> 1.1.1 小标題一<br/> 1.2 中标題二<br/> 1.2.1 小标題二<br/> 1.2.2 小标題三<br/>​

使用format屬性設定輸出文字的格式。預設的格式為“1”,即輸出數字。用于表示格式的字元串如表2所示。

表2: 格式字元串

字元串 格式範例
1 1 2 ... 10 11 ...
01 01 02 ... 09 10 ... 99 100 ...
A A B ... Z AA AB ...
a a b ... z aa ab ...
i i ii iii iv v vii viii ix x ...
I I II III IV V VII VIII IX X ...

我們上面的例子中為了在xsl:number元素之後加一個空格,不得不使用了xsl:text元素。實際上隻要将format屬性設定為“1 ”就可以了。level屬性為multiple的情況下也可以指定類似于“1.A.I”這樣的格式。

6 循環

需要循環進行處理時可以使用xsl:for-each元素。基本代碼如下所示。

​<xsl:for-each select = "節點集合"> <!-- 内容:(xsl:sort*, 模闆) --> </xsl:for-eaxh>​

必須設定select屬性,來指定被處理的節點集合。如果使用了後面講述的排序的話則按照排序結果的順序進行處理,否則按照節點出現順序進行處理。

例如,如下所示,bookmark元素中包含了多個link元素。

​<bookmark> <link> <title>技術評論公司</title> <url>http://www.gihyo.co.jp</url> </link> <link> <title>ONGS</title> <url>http://www.ongs.gr.jp</url> </link> </bookmark>​

利用下面使用了xsl:for-each元素的模闆規則,可以将其轉換成HTML表格(圖1)。

​<xsl:template match="bookmark"> <table border="1"> <xsl:for-each select="link"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="url"/></td> </tr> </xsl:for-each> </table> </xsl:template>​

圖1: 使用表格進行顯示

但是,使用如下所示的模闆規則,不用xsl:for-each元素也能得到同樣的輸出結果。

​<xsl:template match="bookmark"> <table border="1"> <xsl:apply-templates select="link"/> </table> </xsl:template> <xsl:template match="link"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="url"/></td> </tr> </xsl:template>​

僅定義模闆規則有時候很難進行轉換。例如,需要将行和列交換生成如圖2所示的表時,不使用xsl:for-each元素就很難做到。

圖2: 行列交換

使用xsl:for-each元素可以生成如圖2所示的輸出結果。

​<xsl:template match="bookmark"> <table border="1"> <tr> <xsl:for-each select="link/title"> <td><xsl:value-of select="."/></td> </xsl:for-each> </tr> <tr> <xsl:for-each select="link/url"> <td><xsl:value-of select="."/></td> </xsl:for-each> </tr> </table> </xsl:template>​

7 條件處理

在XSLT中,進行條件處理的元素有xsl:if和xsl:choose兩個。xsl:if進行“如果~就~”的if-then型處理,xsl:choose當有多個選擇項存在時進行處理。

7.1 xsl:if

xsl:if元素擁有test屬性,可指定邏輯表達式。邏輯表達式為真的情況下執行模闆的轉換,假的情況下不進行轉換。

​<xsl:if test = "邏輯表達式"> <!-- 内容: 模闆 --> </xsl:if>​

​例如,對以下XML文檔,​

​<people> <person> <name>張三</name> <age>30</age> </person> <person> <name>李四</name> <age>20</age> </person> <person> <name>周五</name> <age>10</age> </person> </people>​

使用如下所示的模闆進行變換。

​<xsl:template match="people"> <ul> <xsl:apply-templates select="person"/> </ul> </xsl:template> <xsl:template match="person"> <li> <xsl:value-of select="name"/>今年 <xsl:value-of select="age"/>歲 <xsl:if test="age[.&lt; 18]"> (未成年) </xsl:if> </li> </xsl:template>​

&lt;是<的意思(&gt;是>)。age元素的值不足18的情況下輸出“(未成年)”。輸出結果如下所示。

​<ul> <li>張三今年30歲</li> <li>李四今年20歲</li> <li>周五今年10歲(未成年)</li> </ul>​

7.2 xsl:choose

xsl:choose元素由一個或一個以上的xsl:when元素和可選的xsl:otherwise元素組成。

​<xsl:choose> <xsl:when test="邏輯表達式"> <!-- 内容: 模闆 --> </xsl:when> <xsl:otherwise> <!-- 内容: 模闆 --> </xsl:otherwise> </xsl:choose>​

與xsl:if元素相同,test屬性的邏輯表達式為真的情況下執行指定的模闆。從上到下依次測試xsl:when元素,但隻有第一個邏輯表達式為真的xsl:when院所的模闆會被執行。如果所有的xsl:when元素的邏輯表達式均為假,則執行xsl:otherwise元素所指定的模闆。xsl:otherwise元素不存在時則不執行任何模闆。

例如,對于如下文檔,

​<ol> <li>起床</li> <li>洗臉</li> <li>吃早飯</li> <li>上班</li> </ol>​

應用如下所示的模闆。last()函數傳回被處理的内容的大小。

​<xsl:template match="ol"> <morning> <xsl:for-each select="li"> <todo> <xsl:choose> <xsl:when test="position()=1"> <xsl:text>首先</xsl:text> </xsl:when> <xsl:when test="position()=last()"> <xsl:text>最後</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>第</xsl:text> <xsl:value-of select="position()"/> </xsl:otherwise> </xsl:choose> <xsl:value-of select="."/> </todo> </xsl:for-each> </morning> </xsl:template>​

輸出結果如下所示。

​<morning> <todo>首先起床</todo> <todo>第2洗臉</todo> <todo>第3吃早飯</todo> <todo>最後上班</todo> </morning>​

8 排序

為将資料排序,可以在xsl:apply-templates元素或xsl:for-each元素的子節點中增加xsl:sort元素。xsl:sort元素的基本代碼如下所示。

​<xsl:sort select = "字元串表達式" data-type = "資料類型" order = "順序"/>​

通過select屬性指定排序的節點。通過data-type屬性指定字元串的資料類型。設定為text就能夠按照人們預設的字典順序進行排序。設定為number将把字元串看作數字,按照數字的值進行排序。order屬性設定排序的順序。升序為ascending、降序為descending。未指定時預設為升序。其他能夠設定的屬性包括設定語言的lang屬性,設定大小寫字母哪個優先的case-order屬性等。

例如,将如下所示的由姓名(name)、年齡(age)組成的人(person)的資料按照姓名和年齡進行排序。

​<people> <person> <name>張三</name> <age>30</age> </person> <person> <name>李四</name> <age>20</age> </person> <person> <name>周五</name> <age>10</age> </person> </people>​

下面是按照年齡升序、姓名降序進行排序并生成HTML表格的模闆規則。

​<xsl:template match="people"> <h1>按照年齡升序排列</h1> <table border="1"> <xsl:apply-templates select="person"> <xsl:sort select="age" data-type="number"/> </xsl:apply-templates> </table> <h1>按照姓名降序排列</h1> <table border="1"> <xsl:apply-templates select="person"> <xsl:sort select="name" data-type="text" order="descending"/> </xsl:apply-templates> </table> </xsl:template> <xsl:template match="person"> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="age"/></td> </tr> </xsl:template>​

輸出結果如圖3所示。

圖3: 排序結果

與此相同,使用xsl:for-each元素重新書寫代碼則如下所示。要注意,在将xsl:sort元素作為xsl:for-each元素的子節點使用時,必須将其寫在開頭的地方。

​<xsl:template match="people"> <h1>按照年齡降序排列</h1> <table border="1"> <xsl:for-each select="person"> <xsl:sort select="age" data-type="number"/> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="age"/></td> </tr> </xsl:for-each> </table> <h1>排序</h1> <table border="1"> <xsl:for-each select="person"> <xsl:sort select="name" data-type="text" order="descending"/> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="age"/></td> </tr> </xsl:for-each> </table> </xsl:template>​

9 變量

在XSLT中可以使用變量。

9.1 綁定變量

可以為變量指派的元素有xsl:variable元素和xsl:param元素。

9.1.1 xsl:variable元素

基本代碼如下所示。

​<xsl:variable name = "變量名" select = "表達式"> <!-- 内容: 模闆 --> </xsl:variable>​

使用name屬性指定變量名(必須)。select屬性和内容都不存在的話可以寫成空字元串。

​<xsl:variable name="x"/>​

這種寫法與下面的寫法意思相同。

​<xsl:variable name="x" select="''"/>​

通過select屬性可以指定變量中代入的值。使用select屬性給變量指派的話,内容必須為空。例如給變量x指派為2時的代碼如下所示。

​<xsl:variable name="x" select="2"/>​

這種情況下,使用

​<xsl:value-of select="item[$x]"/>​

将輸出第二個item元素。

通過内容來指派時,變量的值不是數值,而是結果樹的片斷。關于結果樹的片斷請參照參考文獻[1]。

​<xsl:variable name="x">2</xsl:variable>​

這種情況下,使用

​<xsl:value-of select="item[$x]"/>​

不會輸出第二個item元素,而是輸出了第一個元素。使用值為結果樹片斷的變量時應當像下面這樣書寫代碼。

​<xsl:value-of select="item[position()=$x]"/>​

9.1.2 xsl:param元素

xsl:variable元素和xsl:param元素基本上相同。一個差別是,XML解釋器假定xsl:param變量中儲存着預設值,并可以使用xsl:with-param元素來向模闆中傳值。詳細情況請參見參考文獻[1]。

9.2 通路變量

在表達式中通路變量時,需要在變量名前加上$符号。使用xsl:value-of元素通路變量則可以輸出變量的值。

10 指定輸出格式

XSLT處理器的任務是從XML文檔轉換成新的XML文檔,但是也能夠輸出XML文檔之外的格式。通過xsl:output元素可以指定輸出格式。該元素隻能作為頂層元素使用。基本代碼如下所示。

​<xsl:output method = "輸出格式" version = "版本" encoding = "編碼" omit-xml-declaration = "yes" | "no" standalone = "yes" | "no" indent = "yes" | "no" />​

通過method指定輸出格式。可以指定的格式包括html、html、text等。未指定時預設為xml,但如果滿足以下條件則為html。

  • 結果樹的根節點的元素名為html(不區分大小寫),并且含有子元素。
  • 不包含命名空間的URI。
  • 結果樹的根節點的子元素之前出現的文本隻包含空白。

通過version可以指定輸出格式的版本。通過encoding指定輸出時使用的字元編碼。通過omit-xml-declaration來指定是否省略XML定義。通過standalone指定是否輸出獨立文檔的聲明。通過indent指定輸出結果樹時是否使用縮進的格式。