CSS與XSLT

CSS

CSS(層疊樣式表)是W3C制定的網頁樣式標準,以彌補HTML語言在表現能力上的不足。現在使用的是CSS level 2,於1998年5月發佈。
XML支持CSS,以實現數據的顯示控制。使用CSS可獲得以下優勢:
數據重用:一個CSS可應用於多個XML文檔
增強表現力:利用CSS可以修飾數據的顯示
增加數據定位:可以控制數據的顯示位置
CSS樣式規則
選擇符 { 屬性 : 屬性值 ; [屬性 : 屬性值 ; ……] }
 例如:   student{ font-family: 宋體; }
選擇符:表示受樣式聲明約束的一個或多個元素
多個選擇符:  cell1,cell2
子選擇符: class > student
子孫選擇符: class name
相鄰兄弟:cell1+cell2(二者必須同時、順序、連續出現)
屬性:受約束的選擇符的樣式屬性
屬性值:屬性的取值
樣式是繼承的,即在某元素上定義的樣式將直接傳遞給其子孫元素

<!--嵌入式CSS-->
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/css"?>
<student xmlns:html="http://www.w3c.org/Profiles/XHTML-transitional">
	<html:style>
		student{display:block;background-color:blue;}
		name{display:line;font-size:12pt;color:red;}
		age{font-size:20pt;color:yellow;}
	</html:style>
	<name>張三</name>
	<age>20</age>
	<name>李四</name>
	<age>21</age>
</student>
/**獨立的CSSCSS文檔stud.css**/
student{ display:block; background-color:blue; }
name{ display:line; font-size:12pt; color:red; }
age{ font-size:20pt; color:yellow; }
<!--XML文檔-->
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href=“stud.css" type="text/css"?>
<student>
	<name>張三</name>
	<age>20</age>
	<name>李四</name>
	<age>21</age>
</student>

XSLT概述

XSL(eXtensible Stylesheet Language,可擴充樣式表語言)是針對XML提出的,比CSS更爲有效。XSL是用XML定義的,爲XML的樣式顯示設計的。XSL文檔是格式良好的。利用XSL,可以將XML轉化爲HTML,可以過濾或分類XML數據,可以對XML文檔的片斷進行尋址,可以基於數據值來格式化XML數據,也可以向不同設備輸出XML數據。
XSL包含3部分:
  XSLT(Transformation):定義轉化XML的方法
  XPath:定位XML數據的方法,已發展爲查詢語言
  XSL-FO(Formatting Object):格式化XML的方法,如轉化爲PDF
XSL用途是XML->XML,其實XSL和XHTML都是XML

XSLT處理器

例如:

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:template match="/班級">
		<html>
			<body>
				<table border="1" >
					<tbody>
						<tr bgcolor="green">
							<th>姓名</th>
							<th>年齡</th>
						</tr>
						<tr>
							<td>
								<xsl:value-of select="學生/姓名"/>
							</td>
							<td>
								<xsl:value-of select="學生/年齡"/>
							</td>
						</tr>
					</tbody>
				</table>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href="std1.xsl" type="text/xsl"?>
<班級>
	<學生>
		<姓名>張三</姓名>
		<年齡>21</年齡>
	</學生>
	<學生>
		<姓名>李四</姓名>
		<年齡>20</年齡>
	</學生>
</班級>

XSLT的stylesheet元素

stylesheet元素是XSLT文檔的根元素,語法爲:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
 <xsl:tempate match="/">
 ……
 </xsl:template>
</xsl:stylesheet>

這裏分別聲明使用了W3C的xslt、fo、schema、xpath等名稱空間

XSLT模板

XSLT將XML文檔看作一個對象,可以用樹結構表示,XML的根元素對應根節點,各子元素分別對應樹的節點。
XSLT處理器從XML文檔樹中查找指定的節點(元素),找到後,再從XSLT文檔中找到與該節點匹配的樣式定義(模板),按指定的樣式顯示數據。
XSLT模板可以是HTML或CSS
XSLT模板是XSLT最重要的概念。XSLT模板用template元素聲明,包含一系列XSL指令,控制XSLT轉換流程並指定XSLT轉換的輸出內容
XSLT模板有兩種:
模板規則(Template Rule):匹配並處理指定的XML節點。必須有match屬性,屬性值爲XPath表達式,指明該模板可匹配哪些XML節點
具名模板(Named Template):可被call-template元素反覆調用,處理當前的XML上下文內容。必須有name屬性,以便調用
初始上下文節點和初始模板
XSLT轉換從初始上下文節點(Initial Context Node)開始,XSLT處理器調用與該節點匹配的模板,按該模板的內容執行轉換
初始上下文節點是XSLT轉換開始時在XML文檔中定位的節點。如果將XML文檔直接傳入XSLT處理器,初始節點就是XML文檔的根節點。如果是從XML文檔的某個節點傳入的,那麼該節點就是初始節點
初始模板(Initial Template)是和XSLT初始節點匹配的XSLT模板。一般地,初始節點是根節點,初始模板由屬性match=“/”的template元素指定。如果初始節點元素爲“我的文檔”,則初始模板的屬性match=“我的文檔”
如果沒有與初始節點匹配的模板,XSLT處理器默認執行一個<xsl:apply-templates/>操作,匹配所有子節點
xml中根節點爲/
<xsl:value-of select="*/name"/>用於讀取元素中包含的文字內容,或是某個屬性的值,注意別遺忘了最後的斜槓,*爲通配符,代表當前節點下的所有的節點,/爲下一級

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:template match="/">
		<xsl:call-template name="PrintCurrentNode"/>
		<xsl:apply-templates select="我的文檔"/>
	</xsl:template>
	<xsl:template match="我的文檔">
		<xsl:apply-templates select="標題"/>
	</xsl:template>
	<xsl:template match="標題">
		<xsl:call-template name="PrintCurrentNode"/>
		<xsl:value-of select="text()"/>
	</xsl:template>
	<xsl:template name="PrintCurrentNode">
		<xsl:text>當前節點的名稱爲:</xsl:text>
		<xsl:value-of select="name()"/>
		<xsl:text>,節點在上下文中的位置是:</xsl:text>
		<xsl:value-of select="position()"/>
		<xsl:text>。</xsl:text>
	</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href="mydoc.xsl" type="text/xsl"?>
<我的文檔>
	<標題>XML實例分析</標題>
	<段落>這是第一段的內容</段落>
	<段落>this is 2nd paragraph</段落>
</我的文檔>

轉換結果:當前節點的名稱爲:,節點在上下文中的位置是:1。當前節點的名稱爲:標題,節點在上下文中的位置是:1。XML實例分析
上下文節點的改變
在XSLT處理器處理過程中,上下文節點從初始節點開始移動到模板中選定的節點
能改變上下文節點的XSLT指令是:
<xsl:apply-templates select=“XPath表達式”/> 從當前節點開始,找出所有匹配的節點,並逐一應用相應的模板進行處理
<xsl:for-each select=“XPath表達式”> 從當前節點開始,選出所有匹配的節點,按照指定的處理指令逐一處理各個節點
這裏XPath表達式用於節點定位,必須能夠指明節點位置

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:output method="html" encoding="gb2312"/>
	<xsl:template match="/">
		<table border="1">
			<tbody>
				<tr>
					<th>姓名</th>
					<th>語文</th>
					<th>數學</th>
				</tr>
				<xsl:apply-templates select="成績單/班級"/>
				<xsl:apply-templates select="成績單/班級" mode="平均"/>
			</tbody>
		</table>
	</xsl:template>
	<xsl:template match="班級">
		<xsl:apply-templates select="學生"/>
	</xsl:template>
	<xsl:template match="班級" mode="平均">
		<tr>
			<td>平均</td>
			<td>
				<xsl:value-of select="format-number(sum(學生/@語文)div count(學生), '###.0')"/>
			</td>
			<td>
				<xsl:value-of select="format-number(sum(學生/@數學)div count(學生), '###.0')"/>
			</td>
		</tr>
	</xsl:template>
	<xsl:template match="學生">
		<tr>
			<td>
				<xsl:value-of select="@姓名"/>
			</td>
			<td>
				<xsl:value-of select="@語文"/>
			</td>
			<td>
				<xsl:value-of select="@數學"/>
			</td>
		</tr>
	</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href="scorelist.xsl" type="text/xsl"?>
<成績單>
	<班級 名稱="計算機1班">
		<學生 姓名="張三" 語文="87" 數學="60"/>
		<學生 姓名="李四" 語文="90" 數學="88"/>
		<學生 姓名="王五" 語文="80" 數學="70"/>
		<學生 姓名="馬六" 語文="83" 數學="86"/>
	</班級>
	<班級 name="計算機2班">
	</班級>
</成績單>

將輸出改爲分班級組表方式,即一個表格對應一個班,包含該班同學的成績和平均成績
······
內建模板規則
XSLT處理器內建3條模板規則:
內建模板用於匹配文檔節點或其他未能被XSLT模板匹配的元素節點,對這些節點一一執行<xsl:apply-templates/> 這些節點可能是未定義匹配模板,也可能是匹配模板有“特殊”需要(用mode聲明),也可能雖然已定義,但在apply-templates中未聲明或聲明錯誤
內建模板自動匹配所有屬性和文本節點,並將節點的值輸出到結果樹中
內建模板匹配所有處理指令和註釋,但是一個“空模板”,不執行任何操作
不包含任何模板的XSLT文檔將從XML文檔的根節點開始,遍歷所有元素和文本節點,但不輸出任何元素,只輸出文本內容
模板的優先級
由於模板衝突較普遍,按如下方式處理優先級:
xsl:import導入的模板的優先級較低,而xsl:include包含的模板具有與當前模板相同的優先級
若指定了模板的優先級(priority屬性),則按指定值處理
對於未聲明優先級的模板,根據match屬性值計算優先級:
任何節點測試:-0.5,如node()、text()、*、@*等
ns:*       -0.25,   可匹配指定名稱空間的任何元素
元素名稱:0,  可匹配指定名稱的元素
@屬性名稱:0,  可匹配指定名稱的屬性
processing-instruction(pi):匹配指定名稱的指令
其他:0.5,如 “/”、 “E1/E2”、 “E1/[E2]”、 “*/*”、 ……
使用了“|”分割的多個XPath表達式的模板規則,先將各表達式抽出,組成單獨的模板分別計算優先級
內建模板的優先級最低

數據篩選

XSl流程控制語句
<xsl:if test="條件表達式">
some output
</xsl:if>
例如:
<xsl:if test="id[text()='1']">
</xsl:if>

chose與when-otherwise:
<xsl:choose>
   <xsl:when match="">
     some output
   </xsl:when>
   <xsl:otherwise>
     others output
   </xsl:otherwise>
<xsl:choose/>
例如:
<xsl:choose>
  <xsl:when test="id[text()='1']">
  </xsl:when>
  <xsl:otherwise>
  </xsl:otherwise>
</xsl:choose>

排序

sort一般放在for-each中,格式爲:
 <xsl:sort select=“XPath表達式” />
例如:
 <xsl:for-each select=“班級”>
  <xsl:sort select=“學生/@學號”/>
  <xsl:value-of select=“學生”/>
 </xsl:for-each>
可以用order屬性聲明排序方式

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:template match="/">
		<html>
			<head>
				<title><xsl:value-of select="書籍/書名"/></title>
			</head>
			<body>
				<h3>
					<xsl:value-of select="書籍/書名"/>
					<p><xsl:apply-templates select="書籍/作者"/></p>
				</h3>
				<h3>目錄</h3>
				<xsl:apply-templates select="書籍/目錄/章節" mode="標題"/>
				<xsl:apply-templates select="書籍/目錄/章節" mode="簡介"/>
			</body>
		</html>
	</xsl:template>
	<xsl:template match="作者">
		<xsl:value-of select="."/>
		<xsl:if test="position() != last()">
			<xsl:text>,</xsl:text>
		</xsl:if>
		<xsl:if test="position() = last()">
			<xsl:text> 著</xsl:text>
		</xsl:if>
	</xsl:template>
	<xsl:template match="章節" mode="標題">
		<h3><xsl:value-of select="@編號"/>、<xsl:value-of select="@標題"/></h3>
	</xsl:template>
	<xsl:template match="章節" mode="簡介">
		<h3><xsl:value-of select="@編號"/>、<xsl:value-of select="@標題"/></h3>
		<xsl:value-of select="."/>
	</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/xsl" href="sampl1.xsl" ?>
<書籍>
	<書名>XML數據管理</書名>
	<作者列表>
		<作者>張三</作者>
		<作者>李四</作者>
		<作者>王五</作者>
	</作者列表>
	<年份>2001</年份>
	<目錄>
		<章節 編號="1" 標題="XML簡介">介紹XML的基本知識</章節>
		<章節 編號="2" 標題="DTD與Schema">XML文檔的有效性</章節>
		<章節 編號="3" 標題="XML DOM">文檔對象模型DOM</章節>
		<章節 編號="4" 標題="XML程序設計">利用DOM編寫程序</章節>
	</目錄>
</書籍>

 

數據導出

用output導出異構的XML文檔或text、html文檔,可以存入另一文件
output的格式爲:
<xsl:output  method=“xml|html|text”
version=“2.0” encoding=“UTF-8”
omit-xml-declaration=“yes|no”
standalone=“yes|no”
…./>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章