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所示。所謂的上下文節點,就是由上下文構成的節點,可以了解為“處理對象”。另外,今後會出現“目前節點”的概念,可以了解為“被選中的節點”。 11
表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 屬性值模闆
需要生成屬性值時,可以使用大括号{}将表達式括起來。22。
例如,想由
<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">
<
</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[.< 18]">
(未成年)
</xsl:if>
</li>
</xsl:template>
<是<的意思(>是>)。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指定輸出結果樹時是否使用縮進的格式。