关闭

XML第一篇:XSL彩繪你的XML (初探XSL) [转载]

789人阅读 评论(0) 收藏 举报
XML第一篇:XSL彩繪你的XML (初探XSL)

恆逸資訊教育訓練中心首頁

作者: 恆逸資訊 許嘉仁

自從XML發展至今,已經在許多資料的應用產生相當大的影響,相關的技術標準也因應而生,例如XSL、XML DOM(Document Object Medel)物件、DTD、XML Schema等等。在這篇文章中,我們首先對XSL技術作一了解,並舉幾個應用實例來表現XSL技術。

最佳拍檔 XML 與 XSL

最常見的XSL應用是交換文件,也就是目前最熱門的B2B或B2C的應用,舉個例子來說,網際網路的電子商場相當盛行,但是訂單的處理卻是各大網站極重的負擔,為什麼呢?如果是照傳統的方式,使用者將一份訂單送至網站,必須經過程式處理並存入資料庫,然後印製訂單、辦理付款、傳真或Mail至倉庫,甚至需要做一些簽核的手續等等繁複的工作,這都還好,至少資料只是在公司內部運作,發生問題都還能夠解決。
但是,如果這份訂單所訂購的商品牽扯到上游廠商或其他合作廠商,就會面臨公司制度及使用的軟硬體不同的窘境,簡單來講,雙方處理訂單的時候所採用的格式可能會有所不同,格式會有哪些不同呢?我們假設一個環境來說明,A公司想要跟B公司購買書籍,但是A公司訂購系統這個應用程式所發出的訂單格式如下:
< ?xml version="1.0"? >
< order >
< orderitem title="Sushi, Anyone" isbn="72-80081-025" >
< price >14.99< /price >
< quantity >2< /quantity >
< /orderitem >
< orderitem title="Straight Talk About Computers" isbn="9-001-122-01" >
< price >19.99< /price >
< quantity >5< /quantity >
< /orderitem >
< /order >
-- A公司訂單格式 --
A公司訂單格式的order標籤存放整份訂單,orderitem標籤存放訂購項目的資訊,title標籤存放書名,isbn標籤存放書號,price標籤存放價格,quantity標籤存放訂購數量,但是要讓B公司能夠快速處理訂單的方式當然是希望能夠收到B公司出貨系統這個應用程式能夠處理的訂單格式,格式如下:
< ?xml version="1.0"? >
< neworder >
< orderDetail >
< title >Sushi, Anyone< /title >
< isbn >72-80081-025< /isbn >
< price >450< /price >
< quantity >2< /quantity >
< /orderDetail >
< orderDetail >
< title >Straight Talk About Computers< /title >
< isbn >9-001-122-01< /isbn >
< price >600< /price >
< quantity >5< /quantity >
< /orderDetail >
< /neworder >
-- B公司訂單格式 --
B公司訂單格式的neworder標籤存放整份訂單,orderDetail標籤存放訂購項目的資訊,title標籤存放書名,isbn標籤存放書號,price標籤存放價格,quantity標籤存放訂購數量,而且B公司資料庫存放價格的欄位是以台幣為單位,看完這兩份訂單格式,我們就知道這種情況經常出現在各大企業之間,雙方又不大可能改寫自己的系統來因應眾多的合作廠商,所以如何讓企業雙方資料交換能夠既簡單又省錢省力呢?這時候我們就可以透過XSL技術來幫我們達成。

撰寫 XSL 第一步

首先我們要先了解XSL也是一種Language,所以它也有自己的語法,只不過它所有的語法都是以Tag的方式來描述,在撰寫HTML的時候,我們會有起始和結尾的標籤,例如:
  < HTML >


< /HTML >
在撰寫XSL文件的時候也是一樣會有起始和結尾標籤,如下:
  < xsl:stylesheet xmlns:xsl=http://www.w3.org/TR/WD-xsl >


< /xsl:stylesheet >
唯一的不同是XSL文件必須加上XML Namespace(XML命名空間),也就是上面程式片段的 xmlns:xsl="http://www.w3.org/TR/WD-xsl"這個屬性內容,這是用來告訴Parser所使用的是哪種語言,因為XSL語言還在不斷新增以及修正,像上述的語法是MSXML 1.0在使用,當我們安裝了MSXML 3.0的元件後,如果有使用到MSXML 3.0才有的語法或者是修正過的語法就必須要將它改成 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"才能執行。

XSL 的迴圈

如果想要轉換文件格式,首先我們要先找到要轉換的資料在哪個節點,而利用< xsl:template match="/" >…< /xsl:template > 這個語法中的屬性 match="/" 可以幫我們找到XML文件的根節點,接下來我們利用XSL語言的迴圈語法< xsl:for-each select="//orderitem" >…< /xsl:foe-each > 將每一筆訂購項目節點(orderitem nodes)抓出來作處理,程式如下:
  < xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" >
< xsl:template match="/" >


< xsl:for-each select="//orderitem" >

< /xsl:for-each >
< /xsl:template >
< /xsl:stylesheet >

XSL 取得資料的方式

在ASP(Active Server Page)當中如果要印出RecordSet的結果到Client端,我們會透過Do…Loop迴圈以及Response.Write語法或直接將輸出的文字放在HTML區段,如下:
  < html >
< head >Sample< /head >
< body >
< % Do Until RS.EOF% >
< b >
< % Response.Write RS("title") % >
< /b >
< % RS.MoveNext
Loop % >
< /body >
< /html >
在XSL文件裡面也是一樣,只不過輸出文字的語法是,而因為在orderitem項目包含許多不同的資料,所以在屬性select我們指定要抓出title標籤裡面的資料,而我們希望能轉換成B公司訂單的格式,所以我們也必須加上B公司訂單的標籤,如下:
< xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" >
< xsl:template match="/" >
< neworder >

< xsl:for-each select="//orderitem" >
< orderDetail >
< title >< xsl:value-of select="@title"/ >< /title >
< isbn >< xsl:value-of select="@isbn"/ >< /isbn >
< price >< xsl:value-of select="price"/ >< /price >
< quantity >< xsl:value-of select="quantity"/ >< /quantity >
< /orderDetail >
< /xsl:for-each >
< /neworder >
< /xsl:template >
< /xsl:stylesheet >

XSL 的 Script 語言運用

但是我們還少了一個動作,也就我們要將price資料從美金轉換成台幣,所以我們要自行撰寫一個函式來處理,也就是使用這個區段來撰寫,而這就表示我們可以在XSL文件中利用Script Language來幫我們處理一些資料,另外,呼叫函式的語法是使用function(me)這個語法,當中的function是函式名,結果如下:
< xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" >
< xsl:template match="/" >
< neworder >

< xsl:for-each select="//orderitem">
< orderDetail >
< title >< xsl:value-of select="@title"/ >< /title >
< isbn>< xsl:value-of select="@isbn"/ >< /isbn >
< price >< xsl:eval language="vbscript">Trans(me)< /xsl:eval >< /price >
< quantity >< xsl:value-of select="quantity"/ >< /quantity >
< /orderDetail >
< /xsl:for-each >

< /neworder >
< /xsl:template >
< xsl:script language="vbscript" >
function
Trans(x) Trans=cint(x.SelectSingleNode("price").text*30)
end function
< /xsl:script >

< /xsl:stylesheet >
OrderTransform.xsl(For MSXML 1.0)
撰寫完上面的XSL程式檔案,我們使用for-each迴圈抓出每個orderitem節點,使用value-of抓出某個標籤或屬性的資料內容,最後呼叫函式Trans(me),當中的me就是for-each迴圈所抓出來的每個orderitem節點,而在我們撰寫的函式中使用XML DOM的SelectSingleNode抓出price的資料內容並乘上30轉換成台幣再回傳結果。
根據上面的範例,我們當然也可以使用JavaScript來撰寫,所以利用Script Language就能幫我們處理掉許多資料轉換的問題。最後我們只要在A公司訂單格式的XML資料套用上這份XSL文件就能夠幫我們完成工作,套用方法如下:
  < ?xml version="1.0"? >
< ?xml-stylesheet Type="text/xsl" href="OrderTransform.xsl"? >



現在只要使用IE瀏覽A公司訂單的XML文件,IE就會使用MSXML元件來執行XSL,只不過我們看不到轉換後的結果,因為瀏覽器預設將轉換後的結果以HTML方式展現,由於B公司訂單文件的標籤,瀏覽器不認識,所以無法展現結果,但是我們可以幫IE安裝一個工具就能夠按滑鼠右鍵選viewing XSLT output,看到以下轉換的結果。註:這個工具可以到以下網址下載 http://msdn.microsoft.com/downloads/
webtechnology/xml/iexmltls.asp



安裝完畢之後就可以看到轉換後的結果入右圖:

Microsoft XML 3.0 (XSL語法)

但是上面的範例是在MSXML 1.0所使用的方式,所以在這也附上MSXML 3.0的XSL範例,這個範例可以獲得同樣的結果,如下:
< xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace" version="1.0" >
< xsl:template match="/" >
< neworder >

< xsl:for-each select="//orderitem" >
< orderDetail >
< title >< xsl:value-of select="@title"/ >< /title >
< isbn >< xsl:value-of select="@isbn"/ >< /isbn >
< xsl:for-each select="price" >
< price >< xsl:value-of select="user:Trans(.)" / >< /price >
< /xsl:for-each >
< quantity >< xsl:value-of select="quantity"/ >< /quantity >
< /orderDetail >
< /xsl:for-each >

< /neworder >
< /xsl:template >

< msxsl:script language="VBScript" implements-prefix="user" >
function Trans(nodeList)
Trans=cint(nodeList.item(0).text*30)
end function
< /msxsl:script >
< /xsl:stylesheet >
OrderTransform-forxml3.xsl(For MSXML 3.0)
我們可以看到有三個比較大的不同點,第一個是之前提到的XSL版本問題外,第二個是我們自行撰寫的script區段也使用到新的語法,所以在起始標籤我們必須加上 xmlns:msxsl="urn:schemas-microsoft-com:xslt" 命名空間,第三個是呼叫函式的方式也省略掉區段,我們可以直接使用來呼叫,而這邊也要加上 xmlns:user="http://www.uuu.com.tw/instructor/jerryhsu" 命名空間,而這是我們自行撰寫的,所以命名空間可以訂定為公司的URL。
雖然上面作的這些工作很瑣碎,但是在企業文件交換應用上的確佔有相當份量,還好這些工作都有工具因應而生,像Microsoft BizTalk Server 2000舊內建兩個工具,一個叫BizTalk Editor用圖形化的方式來制定雙方文件規格,另一個叫BizTalk Mapper讓我們用拖拉繪圖的方式自動產生相對的XSLT檔案,對於文件轉換就變得更簡單了。
討論到這邊,究竟XSL如何彩繪我們的XML文件呢?其實道理是相同的,只要我們把XML文件透過XSL轉換成HTML標籤就能夠在瀏覽器上有不同的展現。
XML的其中一個精神是希望能夠做到Multiple Output,也就是多輸出的能力,那什麼是Multiple Ouput呢?例如使用XML當作儲存資料的媒體,做到同一份資料產生多樣化的展現,好比一份電子書檔案,可能存放為*.doc(Microsoft Word文件格式)或*.txt(純文字檔案)或*.pdf等等不同格式的檔案,它們個別都需要一個專屬的應用程式才能讀取出檔案中的內容,如果想要將一份電子書(假設是Microsoft Word文件)在瀏覽器上或在PDA、WAP手機上或其他應用程式上展現,也就是做多方的輸出的話,除非應用程式外掛功能,能夠將文件轉換成另一種格式,否則其他應用程式根本無法讀取Word文件。
由此可見,文件格式的轉換扮演著溝通的角色,而XSL便是用來轉換文件格式的技術,那XSL如何彩繪XML文件?既然XSL可以幫我們轉換文件讓其他應用程式能夠存取,換言之,我們可以將文件轉換成HTML格式讓瀏覽器來瀏覽,並且XSL也結合了CSS(Cascading Style Sheet)、DHTML(Dynamic HTML)、Script Language(VBScript、JavaScript、XSL Script)讓XML文件的應用產生強大的能力。
最後在這邊舉一個XML作不同展現的範例,下列是一個有關課程的XML檔案,內容如下:
< ?xml version="1.0"? >
< MenuList >
< Menu MenuTitle="微軟認證課程" >
< MenuItem >MCDBA(全套)< /MenuItem >
< MenuItem >MCSD(全套)< /MenuItem >
< MenuItem >W2K MCSE Upgrade(全套)< /MenuItem >
< MenuItem >W2K MCSE(全套)< /MenuItem >
< MenuItem >NT 4.0 MCSE(全套)< /MenuItem >
< /Menu >
< Menu MenuTitle="Win2000課程" >
< MenuItem >Windows 2000 Pro. 前置準備及配置< /MenuItem >
< MenuItem >Windows2000 Pro. 配置與提昇管理< /MenuItem >
< MenuItem >NT4升級Windows 2000技術< /MenuItem >
< MenuItem >Windows 2000 保全環境設計< /MenuItem >
< MenuItem >Windows 2000 目錄服務設計< /MenuItem >
< MenuItem >Windows 2000 網路服務設計< /MenuItem >
< /Menu >
< /MenuList >
原本瀏覽器的展現如下圖:
經過套用不同的XSL檔案可以讓它加上圖片和超連結和展開收合功能,結果如下:
甚至能夠再多加點畫面設計,讓它更具有專業的感覺,如下圖:
透過如此多樣化的設計,讓同一份XML文件擁有不同的風貌,正是XSL應用的另一方向,只要將資料儲存成XML格式,就能夠輕易地將之轉換成不同的格式運用在不同的平台或應用程式上。
至於如何將舊有的ASP頁面轉移成XML-Base的展現,將資料和展現分別獨立出來,並且讓XML充分發揮它的功用,而轉移的過程中又必須注意到哪些地方呢?上面的範例是如何做的呢?下一期我們再繼續來探討。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:136455次
    • 积分:1641
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:74篇
    • 译文:0篇
    • 评论:21条
    文章分类
    最新评论