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”
…./>