日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XSL和XSLT

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XSL和XSLT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
XSL的作用:將XML轉換成HTML
例子說明一切:下面是XML文檔的一部分:

<?xml version="1.0" encoding="ISO8859-1" ?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
...

</CATALOG>

然后我們將下面的XSL文件作為HTML的模板將XML數據轉換為HTML文件:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="2" bgcolor="yellow">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="CATALOG/CD">
<tr>
<td><xsl:value-of select="TITLE"/></td>
<td><xsl:value-of select="ARTIST"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

在上面的代碼中, xsl:for-each元素的作用是定位XML文檔中的哪些元素需要按以下模板顯示。select屬性用來定義源文件中的元素名。指定屬性的這種語法又稱為XML Pattern(模式),類似文件子目錄的表示形式。xsl:value-of元素用來在當前層次中插入子元素的內容模板。
因為XSL樣式表自身也是一個XML文檔,因此,XSL文件的開頭以一個XML聲明開始。 xsl:stylesheet元素用來聲明這是一個樣式表文件。<xsl:template
match="/">語句表示XML的源文檔在當前目錄下。
如果為XML文檔加上XSL樣式表,看下面代碼第2行,你的瀏覽器就可以精確的將XML 文檔轉換為HTML文件。

<?xml version="1.0" encoding="ISO8859-1" ?>
<?xml-stylesheet type="text/xsl" href="cd_catalog.xsl"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>

...

</CATALOG>

XSL 的索引

當XML文檔被轉換成HTML文件,索引應該同時建立。簡單的辦法就是給你的for-each元素增加一個order-by屬性,就象這樣:
<xsl:for-each select="CATALOG/CD" order-by="+ ARTIST">
order-by屬性帶有一個"+"或者"-" 的符號,用來定義索引的方式,是升序還是降序排列。符號后面的名字就是要索引的關鍵字。

XSL的過濾和查詢

我們希望只顯示滿足一定的條件的XML數據應該怎么做呢?還是上面的例子代碼,我們只需要在xsl:for-each元素的select屬性中加入參數就可以,類似:
<xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']">
參數的邏輯選擇有:
= (等于)
=! (不等于)
&LT& 小于
&GT& 大于等于

?

XSL的控制語句

1.條件語句if...then
XSL同樣還有條件語句(呵呵~~好厲害吧,象程序語言一樣)。具體的語法是增加一個xsl:if元素,類似這樣
<xsl:if match=".[ARTIST='Bob Dylan']">

... some output ...
</xsl:if>
2. XSL 的Choose
choose的用途是出現多個條件,給出不同顯示結果。具體的語法是增加一組xsl:choose,xsl:when,xsl:otherwise元素:

<xsl:choose>
<xsl:when match=".[ARTIST='Bob Dylan']">
... some code ...
</xsl:when>
<xsl:otherwise>
... some code ....
</xsl:otherwise>
</xsl:choose>

?

XSLT

XSL和XSLT從狹義上理解是一樣的,而按照W3C的標準,XSLT的說法更嚴格些。

其實很多和上面XSL是重復的,但是下面解釋的更詳細

XSLT的元素語法
1 xsl:template和xsl:apply-templates?

模板(template)是XSLT中最重要的概念之一。XSLT文件就是由一個一個的模板組成,任何一個XSLT文件至少包含一個模板。模板(template)由兩部分組成:匹配模式(match pattern)和執行。簡單的講模式定義XML源文檔中哪一個節點將被模板處理,執行則定義輸出的是什么格式。兩部分對應的語法為xsl:template和xsl:apply-templates。?

xsl:template的語法是:?

<xsl:template

match = pattern?

name = qname

priority = number

?mode = qname>
<!-- 執行內容 -->
</xsl:template>?

xsl:template的作用是定義一個新模板。屬性中name,priority,和mode用來區別匹配同一節點的不同模板。match屬性則控制模板的匹配模式(pattern),匹配模式是用來定位XML源文檔中哪一個節點被模板處理。一個模板匹配一個節點。我們用一個例子來幫助理解:
假設我們要處理一個包含章節和段落文檔。我們用para元素定義段落,用chapter元素定義章節。我們來看看match屬性可能的值。下面的語句寫法說明模板匹配所有的para元素?

<xsl:template match="para">
</xsl:template>?

下面的語句寫法說明模板匹配所有的para元素和所有的chapter元素:?

<xsl:template match="(chapterpara)">
</xsl:template>?

下面的語句寫法說明模板匹配所有的父節點為chapter元素的para元素:?

<xsl:template match="chapter//para">
</xsl:template>?

下面的語句寫法說明模板匹配根節點:?

<xsl:template match="/">
</xsl:template>?

apply-templates語法:

<xsl:apply-templates
select = node set-expression
mode = qname>
</xsl:apply-templates>?

xsl:apply-templates用來執行那一個節點被模板具體處理。你可以將它理解為程序中調用子函數。select屬性用來定義確切的節點名稱。xsl:apply-templates總是包含在xsl:template元素中,象這樣:?

<xsl:template match="/">
<xsl:apply-templates select="para"/>
</xsl:template>?

這段代碼說明摸板匹配整個文檔(根節點),具體執行時處理根節點下所有para元素。?

<xsl:template match="para">
<p><xsl:apply-templates/></p>
</xsl:template>?

而這一段代碼則表示摸板匹配para節點,所有para下的子元素都將被處理。

xsl:value-of?

XSL:value-of用來將源文檔中元素的文本值寫到輸出文檔中。例如:
有一個個人資料的XML文檔:?

<?xml version="1.0" encoding="iso-8859-1"?>
<PERSON>
<name>ajie</name>
<age>28</age>
</PERSON>?

我如果想在輸出文檔中顯示上面這個XML源文檔中的name元素的值,可以這樣寫XSLT代碼:?

<xsl:template match="PERSON">
<xsl:value-of select="name"/>
</xsl:template>

執行后,你會看到"ajie"被單獨顯示出來。其中match="PERSON"定義摸板匹配PERSON節點,xsl:value-of 語法說明需要輸出一個節點的值,而select="name"則定義需要被輸出的元素為name。看這個過程是不是和數據庫里查詢一個人的名字很象?當然,xsl:value-of查詢還有更多,更復雜的語法,因為是涉及尋找和定位的功能,我們會放在后面的XPath語法中在仔細講解。
同樣功能的還有xsl:copy-of,用法一樣,就不重復解釋了。

xsl:for-each?

xsl:for-each語法允許你循環處理被選擇的節點。例如:有一個含多個個人資料的XML文檔:?

<?xml version="1.0" encoding="iso-8859-1"?>
<PEOPLE>
<PERSON>
<name>ajie</name>
<age>28</age>
</PERSON>
<PERSON>
<name>tom</name>
<age>24</age>
</PERSON>

..............
</PEOPLE>?

我需要顯示所有人的姓名,則可以將XSLT代碼寫成:

<xsl:template match="PEOPLE">
<xsl:for-each select="child::PERSON">
<xsl:value-of select="name"/>
</ xsl:for-each>
</xsl:template>

?

xsl:if?

xsl:if類似普通程序語言的if條件語句,允許設定節點滿足某個條件時,被模板處理。xsl:if的語法格式為:?

<xsl:if test=布爾表達式>
template body
</xsl:if>?

如下

<xsl:template match="PEOPLE">
<xsl:if test="@name">
<p><xsl:value-of select="@name"/></p>
</xsl:if>
</xsl:template>?

這段代碼的意思是檢測PEOPLE節點下所有的元素,如果發現有<name>元素,則將<name>元素的值輸出。其中@符號是統配符,表示節點下所有的元素。

xsl:choose, xsl:when 和 xsl:otherwise?

xsl:if語法沒有else的屬性。如果我們要進行多項選擇,那么就要使用xsl:choose / xsl:when / xsl:otherwise系列流程控制語法了。具體的使用請看下面的XSL文件例子:?

<xsl:template match="PEOPLE">
<xsl:choose>
<xsl:when test="@name = 'ajie'">
<B><xsl:value-of select="@name"/></B>
</xsl:when>
<xsl:when test="@name">
<I><xsl:value-of select="@name"/></I>
</xsl:when>
<xsl:otherwise>
No name available
</xsl:otherwise>
<xsl:choose>
</xsl:template>?

說明:首先在PEOPLE節點下尋找<name>屬性值為ajie的元素,如果找到,將ajie用粗體輸出;如果沒有發現值為ajie的<name>元素,則將所有的<name>元素的值都用斜體輸出;如果沒有發現任何<name>元素,則顯示"No name available"。?

xsl:sort?

在XSLT中可以對XML源文檔的元素進行重新排序,排序的語法就是xsl:sort。舉例:下面的代碼就是將文檔元素按name排序。?

<xsl:template match="PEOPLE">
<xsl:apply-templates select="PERSON">
<xsl:sort select="@name"/>
</xsl:apply-templates>
</xsl:template>?

?

XPath的語法

1.當前位置
當我們使用XSLT處理XML源文檔是,我們用Context來表示當前正在被模板處理的節點位置。比如xsl:template match="/"語句中表示Context在文檔的根(root)節點。我不知道如何準確的翻譯Context這個詞,它類似于C語言里的指針,表示程序當前運行的位置。理解Context對于正確處理XSL模板非常重要,當您的XSL模板輸出的文檔和您想要的不一樣,最先應該分析的就是Context在哪里。
Location Paths是用于設定你想要尋找的Context節點位置。就類似DOS的目錄命令。我們看個例子
<xsl:for-each select="child::PEOPLE/descendant::PERSON">
其中child::PEOPLE/descendant::PERSON就是XPath語法,這個表達式就是一個Location Paths,代碼說明要顯示所有PEOPLE元素的子元素和所有PERSON元素的子元素。通常我們會采用更簡單的寫法:
<xsl:for-each select="PEOPLE//PERSON">
我們來解釋path的兩種表示方法:"/"和"//"。
"/"是表示當前文檔的節點,類似DOS目錄分割符。例如:/PEOPLE表示選擇根節點下的PEOPLE元素;PEOPLE/PERSON表示選擇PEOPLE元素下所有的PESON子元素。
"//"則表示當前文檔所有的節點。類似查看整個目錄。例如://PEOPLE表示選擇文檔中所有的PEOPLE元素,無論它在什么層次;PEOPLE//PERSON表示在PEOPLE元素下所有的PERSON元素,無論它的層次多深。

2 尋址操作
Axis和Predicate是XPath語法中對Location Paths進行定位操作的語法,具體的用法列表如下
Axis語法表
--------------------------------------------------------
表達式 簡寫 說明
--------------------------------------------------------
self . 選擇當前的節點.。
例子 :
<TD><xsl:value-of select="."/></TD>
代碼表示在當前位置插入當前的節點包含的文本(text)值,
--------------------------------------------------------
parent .. 選擇當前節點的父節點。
--------------------------------------------------------
attribute @ 選擇一個元素的所有屬性。
例子:
<TD><xsl:value-of select="@PERSONID"/></TD>
選擇PERSON元素的所有屬性.
--------------------------------------------------------
child 選擇當前節點的所有子元素。
--------------------------------------------------------
ancestor 選擇當前節點的所有父元素(包括父元素的父元素,類推)
--------------------------------------------------------
Axis幫助我們選擇當前節點周圍所有的節點,而Predicate則用來定位當前節點內部的元素。表示方法為方括號[]中加表達式:[ Expression ]。具體舉例如下:
PERSON[position()=2] 這句代碼表示尋找第二個"PERSON" 元素
PERSON[starts-with(name, "B")] 這句代碼表示尋找所有名稱以"B"開頭的PERSON元素。
3 運算符
這一節介紹XPath的運算符(Expressions),列表如下:
--------------------------------------------------------
運算符 說明
--------------------------------------------------------
and, or 就是普通意義的and, or
--------------------------------------------------------
= 等于
--------------------------------------------------------
!= 不等于
--------------------------------------------------------
>, >= 大于,大于等于
--------------------------------------------------------
<, <= 小于,小于等于。注意:在XSL文件中,<符號要用< 表示
--------------------------------------------------------
+, -, *, div 加減乘除
--------------------------------------------------------
mod 取模
--------------------------------------------------------
兩個節點一起計算
--------------------------------------------------------
4 功能函數(Functions)
在XPath里有很多功能函數可以幫助我們精確尋找需要的節點。
count()功能
作用:統計計數,返回符合條件的節點的個數。
舉例:<p><xsl:value-of select="count(PERSON[name=tom])"/></p>
說明:代碼的用途是顯示PERSON元素中姓名屬性值為tom有幾個。
number()功能
作用:將屬性的值中的文本轉換為數值。
舉例:<p>The number is: <xsl:value-of select="number(book/price)"/></p>
說明:代碼的用途是顯示書的價格。
substring() 功能
語法:substring(value, start, length)
作用:截取字符串。
舉例:<p><xsl:value-of select="substring(name, 1, 3)"/></p>
說明:代碼的用途是截取name元素的值,從第一個字母開始顯示到第三個。
sum()功能
作用:求和。
舉例:<p>Total Price = <xsl:value-of select="sum(//price)"/></p>
說明:代碼的用途是計算所有價格的和。
上面這些功能只是XPath語法中的一部分,還有大量的功能函數沒有介紹,而且目前XPath的語法仍然在不斷發展中。通過這些函數我們可以實現更加復雜的查詢和操作。

XSLT是一種轉換XML文檔的語言,它包含兩個過程:轉換和格式化。XSLT的功能比CSS強大得多,它有類似數據查詢的語法。

import, include, element, attribute, number, param等等語法,在這里就不一一解釋。我們的目的是讓您對XSLT的語法有基本的概念,理解XSLT作為一種轉換語言的強大功能。

?

有關學習網站

◇ 最權威的網站
http://www.w3.org/Style/XSL/
◇ 有關標準
XSLT1.0 http://www.w3.org/TR/xslt.html
XSLT1.1 http://www.w3.org/TR/xslt11/
XPath1.0 http://www.w3.org/TR/xpath.html
◇ 學習教程
http://www.w3schools.com/xsl/
http://www.wirelessdevnet.com/channels/wap/training/xslt.html
http://msdn.microsoft.com/library/default.asp?URL=/library/psdk/xmlsdk/xslp8tlx.htm
http://www.jenitennison.com/xslt/
http://www.arbortext.com/xsl/
◇ 相關資訊
http://www.xslinfo.com/
http://www.xslt.com/
http://www.xml.com
http://www.oasis-open.org/cover/xsl.html#resources
http://www.xml.org
http://www.ibm.com/developer/xml
http://www.biztalk.org
◇ 相關軟件
http://www.xmlsoftware.com/xsl/
◇ 郵件列表
http://www.15seconds.com/faq/XML/748.htm
http://www.mulberrytech.com/xsl/xsl-list/index.html

總結

以上是生活随笔為你收集整理的XSL和XSLT的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。