青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

興海北路

---男兒仗劍自橫行
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

統計

  • 隨筆 - 85
  • 文章 - 0
  • 評論 - 17
  • 引用 - 0

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

收藏夾

全是知識啊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

XSL:轉換從哪里開始?

前言

愛好XML的人最終會試著將XML轉換為HTML,或者轉換為其他類型的文檔,DOM/SAX顯然不是專門為轉換設計的,CSS對于轉換也是力有不逮,所以XML的愛好者們幾乎無一例外的要遭遇XSL,但是XSL似乎有非常多的用法,對于XML僅僅只是表示格式化的數據而言,XSL顯得復雜且毫無頭緒。

例如《跟我學XSL》和《XSL基礎入門》這樣的教程會帶給你XSL的一些概念和例子,但是對于XSL的運行環境、平臺特性和本質,似乎都語焉不詳,你最終學會的僅僅是在XMLSPY或者IE中打開你的XML看看它轉換后的效果罷了。一有人提到腳本語言或者JAVA中調用XSL你就頭大了,甚至你不清楚XSL和XSLT究竟有什么區別。迷失在網絡中的人們喜歡不停的用google搜索你想要的中文資料,但是其實有那個時間,干脆去那種技術的官方網站上好好看看吧。http://www.w3.org/Style/XSL/是XSL技術的W3C的官方網站,在網頁正文的第一行它就解釋和XSL和XSLT的區別。原文如下:

XSL is a family of recommendations for defining XML document transformation and presentation. It consists of three parts:

XSL Transformations (XSLT)

a language for transforming XML

the XML Path Language (XPath)

an expression language used by XSLT to access or refer to parts of an XML document. (XPath is also used by the XML Linking specification)

XSL Formatting Objects (XSL-FO)

an XML vocabulary for specifying formatting semantics

XSL是一組定義XML文檔的轉換和顯示特征的推薦標準,它包括三個部分:XSL轉換(XSLT)是一種為了轉換XML而定義的語言;XML路徑語言(XPath)是一種表達式語言,它被XSLT用來訪問或者提交一個XML文檔的某些部分(XPath也同時被XML Linking標準使用);XSL格式化對象(XSL-FO)是一個XML詞匯表用來定義XML的格式化語義。

從何開始

一般人學習XSL都是從XMLSPY等工具開始運行他的一個XSL例子,當然用文本編輯器編輯XML何XSL文件,用IE去打開XML也是一個好主意。因為XMLSPY和IE都有嵌入式的XSL解析器,例如IE的XSL解析器是MSXML,這樣不用顯式的調用XSL進行轉換過程,只需要在XML文檔的頭部加上一句<?xml:stylesheet type="text/xsl" href="xxx.xsl"?>就可以讓嵌入的XSL解析器自動的進行轉換了。例如下面這個著名的例子,它包括cd_catalog.xml和cd_catalog.xsl文件,內容如下:

xml文件:

<?xml version="1.0" encoding="GB2312"?>

<?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>

   <CD>

       <TITLE>喀什噶爾胡楊</TITLE>

       <ARTIST>刀郎</ARTIST>

       <COUNTRY>China</COUNTRY>

       <COMPANY>先之唱片</COMPANY>

       <PRICE>20.60</PRICE>

       <YEAR>2004</YEAR>

   </CD>

   <CD>

       <TITLE>敦煌(特別版)</TITLE>

       <ARTIST>女子十二樂坊</ARTIST>

       <COUNTRY>China</COUNTRY>

       <COMPANY>百代唱片</COMPANY>

       <PRICE>25.60</PRICE>

       <YEAR>2005</YEAR>

   </CD>

</CATALOG>

 

xsl文件:

<?xml version="1.0" encoding="GB2312"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

   <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>

將它們保存在同一目錄下然后用IE5以上版本的IE直接打開xml文件,則會看到轉換后的效果。當然用XMLSPY中自帶的瀏覽器也可。

JScript顯式調用XSL解析器

上面的運行方法顯然是“貪天之功”,利用了IE和XMLSPY自帶的XSL解析器,是讓一只看不見的手運行了轉換過程。那么,也可以用Jscript語言顯式的調用XSL解析器,讓沒有嵌入解析器的瀏覽器也可以運行XSL,當然,此瀏覽器必須支持Jscript腳本語言。我們還是使用上面的例子,不過將cd_catalog.xml中的<?xml:stylesheet type="text/xsl" href="cd_catalog.xsl"?>這一行去掉,同時新建一個cd_catalog.html文檔,內容如下:

   <html>

    <body>

    <script language="javascript">

    // Load XML

    var xml = new ActiveXObject("Microsoft.XMLDOM")

    xml.async = false

    xml.load("cd_catalog.xml")

    // Load the XSL

    var xsl = new ActiveXObject("Microsoft.XMLDOM")

    xsl.async = false

    xsl.load("cd_catalog.xsl")

    // Transform

    document.write(xml.transformNode(xsl))

    </script>

    </body>

</html>

將此html文檔在支持Jscript的瀏覽器中打開,即可看到如前一段執行的結果。當然不僅僅是Jscript,其他的腳本語言如VBScript等等也可以,不過Jscript是XSL默認的腳本語言。

腳本擴充的XSL,令人疑惑的xsl:eval標記

    xsl:eval標記并不是一個標準的xsl標記,它屬于http://www.w3.org/TR/WD-xsl這個名字空間,這個名字空間最終被微軟采用,于是xsl:eval也被微軟用來調用Jscript腳本,以此來擴充XSL的功能。而標準的XSL1.0版本的名字空間是http://www.w3.org/1999/XSL/Transform,它并不包含xsl:eval標記,這是很容易理解的,XSL應該屬于一個平臺無關的技術,如果它的某個標記要依賴微軟公司的產品,那顯然是自掘墳墓。關于平臺無關的討論,將在本文的最后展開。

    xsl:eval標記的含義是計算其中腳本語言的表達式,并作為文本輸出。下面的例子中計算了cd_catalog.xml中各種CD的總價格,修改上面的cd_catalog.xsl并另存為cd_catalog2.xsl文件如下:

<?xml version="1.0" encoding="GB2312"?>

<xsl:stylesheet version="1.0" 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>

                 <tr>

                    <td>合計</td>

                    <td>

                       <xsl:eval>total("PRICE")</xsl:eval>

                    </td>

                    <xsl:script>

                       function total(q){

                            temp=0;

                            mark='/CATALOG/CD/'+q;

                            v=selectNodes(mark);

                            for(t=v.nextNode();t;t=v.nextNode()){

                                 temp+=Number(t.text);

                            }

                            return temp;

                      }

                    </xsl:script>

                 </tr>

             </table>

          </body>

       </html>

   </xsl:template>

</xsl:stylesheet>

在IE中打開cd_catalog.xml文件(注意修改xsl為cd_catalog2.xsl)即可看到結果,注意這個xsl文件的這一行<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">,寫錯了名字空間xsl:eval標記就會報錯。

瀏覽器無關的XSL解決方案,服務端的XSL

不管如何折騰,要將XML通過XSL轉換為HTML必須要求本地主機上有一個XSL解析器,不管是瀏覽器內嵌的,還是可以通過腳本語言調用。那么,更好的解決方案當然是從服務器端直接發送HTML回來,這樣無論什么瀏覽器都可以看到轉換的結果了。ASP提供了這個功能,這是可想而知的,不過我對ASP不熟,這段略過,有興趣的可以找本ASP的XML教材看看。

應用程序中的XSL,語言相關的XSL

眾所周知,Java是對XML技術支持得最好的語言,Java上面的xml包非常多,其中支持XSL轉換的包最著名的有Saxon和xalan。Saxon包可以在http://saxon.sourceforge.net/上面下載。將Saxon包解壓縮到C:\saxon6_5_3,6.5.3版本提供了對XSL1.0最穩定的支持。然后在Classpath中加入C:\saxon6_5_3\saxon.jar;C:\saxon6_5_3\saxon-jdom.jar。

Saxon提供命令行式的XSL轉換和API。其中命令行式的轉換如下,將目錄移動到存放xml(去掉xml的指定xsl的那一行)和xsl的目錄,然后輸入下面的命令:

java com.icl.saxon.StyleSheet cd_catalog.xml cd_catalog.xsl

就可以看到輸出在屏幕上的結果,但是這樣看起來不方便,所以輸入如下命令:

java com.icl.saxon.StyleSheet cd_catalog.xml cd_catalog.xsl>a.html

然后將生成的a.html在瀏覽器中打開,可以清晰的看到結果。

下面是在Java程序中調用Saxon包,進行XSL轉換的例子,文件名為XslExam.java:

import java.io.File;

import javax.xml.transform.Result;

import javax.xml.transform.Source;

import javax.xml.transform.Templates;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerConfigurationException;

import javax.xml.transform.TransformerException;

import javax.xml.transform.sax.SAXSource;

import javax.xml.transform.stream.StreamResult;

import com.icl.saxon.ExtendedInputSource;

import com.icl.saxon.TransformerFactoryImpl;

 

public class XSLExam {

      public static void main(String[] args) {

        String sourceFileName = "cd_catalog.xml";

        String styleFileName = "cd_catalog.xsl";

        String outputFileName = "result.html";

        File sourceFile = null;

        File styleFile = null;

        File outputFile = null;

       

        TransformerFactoryImpl factory = new TransformerFactoryImpl();

       

        Source sourceInput = null;

        sourceFile = new File(sourceFileName);

        ExtendedInputSource eis = new ExtendedInputSource(sourceFile);

        sourceInput = new SAXSource(factory.getSourceParser(), eis);

        eis.setEstimatedLength((int)sourceFile.length());

       

        Source styleSource ;

        File sheetFile = new File(styleFileName);

        eis = new ExtendedInputSource(sheetFile);

        styleSource = new SAXSource(factory.getStyleParser(), eis);

       

        outputFile=new File(outputFileName);

       

             try {

                     Templates sheet = factory.newTemplates(styleSource);

                     Transformer instance = sheet.newTransformer();

               Result result = new StreamResult(outputFile);

               instance.transform(sourceInput, result);

              

              } catch (TransformerConfigurationException e) {

                     e.printStackTrace();

              }catch (TransformerException err) {

                     err.printStackTrace();

        }

       }

}

這個例子程序將cd_catalog.xml文件使用cd_catalog.xsl轉換為result.html。在Eclipse3.01中調試通過(Saxon沒有簡單的xsl示例程序,我也是將com.icl.saxon.StyleSheet類拔光了才得到這個稍微簡單的例子,如果需要更詳細的用法,參考com.icl.saxon.StyleSheet類)。

數據是獨立的,處理是平臺相關的

    總結前面的內容,可以看出XSL轉換可以從這幾個地方開始:

Ø         IE,XMLSPY:嵌入的解析器,例如MSXML3;

Ø         JScript,顯式調用XSL解析器;

Ø         用JScript擴充XSL功能,半吊子的XSL;

Ø         瀏覽器無關的XSL解決方案,服務器端的XSL,ASP顯式調用XSL;

Ø         語言相關的XSL,Java的XSL包Saxon,xalan。

可以看出來,XSL無論如何,都是要平臺相關的,第一種方法依賴嵌入瀏覽器的XSL解析器;第二、三種方法依賴操作系統安裝的XSL解析器;第四種方法依賴服務器端安裝的XSL解析器;最后的方法依賴JAVA語言提供的XSL API。其中微軟還不顧W3C的反對,自定義了XSL的腳本擴充功能,功能倒是強大了,可惜脫離了Windows就玩不轉了。JAVA號稱平臺無關,可是JAVA本身就是一個平臺,要是有人的機器沒有JRE又怎么辦呢?丟棄XSL?

不過事物總是有因果的,其實XML作為數據的存儲載體,可以做到完全的平臺無關,但是XSL作為一個可執行的語言,一定要依賴某種已存在的運行環境的,就如同數據庫中的表格和SQL語言一樣。SQL號稱適用于任何關系數據庫,但是實際上還是需要一個環境來run的。那么XSL是否破壞了XML的平臺無關性呢?我認為沒有,因為XSL本身是一個XML文檔,XML文檔可以平臺無關的保存和傳輸,至于使用何種方法來調用它則是另外考慮的問題。再者,XSL的源和目標都是平臺無關的文檔(例如XML和HTML),而它自己的調用方式則是可替換的,這點也減輕了XSL的負罪感吧。

以上的討論都是基于XSL1.0標準的,目前XSL2.0標準尚在討論中,不過初稿已經發布了,而Saxon8.0以上的版本號稱已經支持了XSL2.0。讓我們拭目以待XSL2.0帶給我們的驚喜。

參考文獻

W3C站點:http://www.w3.org/Style/XSL/

XSL主題:http://www-900.ibm.com/developerWorks/cn/xml/theme/x-xsl.shtml

中文譯文站點:http://www.opendl.com/

XSLT是什么類型的語言,SAXON的作者談XSLhttp://www-900.ibm.com/developerWorks/cn/xml/x-xslt/index.shtml

posted on 2008-04-01 17:07 隨意門 閱讀(302) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久亚洲精品一区二区三区 | 亚洲国产精品一区制服丝袜| 在线看成人片| 亚洲一区亚洲| 女女同性女同一区二区三区91| 亚洲日本精品国产第一区| 欧美高清视频一二三区| 亚洲一区二区少妇| 欧美激情第10页| 韩国女主播一区二区三区| 国产性天天综合网| 亚洲欧美日韩精品综合在线观看| 玖玖玖国产精品| 亚洲网址在线| 欧美激情一区二区三区全黄| 国产精品乱码一区二区三区 | 亚洲乱码久久| 欧美成人激情视频免费观看| 亚洲欧美色一区| 久久免费黄色| 国产最新精品精品你懂的| 亚洲一区二区黄| 亚洲日本电影在线| 欧美一级久久久久久久大片| 国产在线拍偷自揄拍精品| 亚洲欧美日韩国产综合精品二区| 亚洲国产天堂久久国产91| 老司机久久99久久精品播放免费| 亚洲欧美日韩国产中文在线| 欧美日韩亚洲不卡| 在线视频欧美日韩| 日韩午夜av电影| 欧美特黄一区| 久久人人97超碰人人澡爱香蕉| 亚洲综合色在线| 国产美女精品在线| 久久久国产精品一区二区三区| 午夜在线精品偷拍| 国产一区二区三区在线观看视频 | 99热在这里有精品免费| 亚洲国产精品v| 欧美精品不卡| 亚洲男人第一av网站| 久久狠狠亚洲综合| 91久久精品国产91久久| 亚洲国产成人在线视频| 欧美日韩精品伦理作品在线免费观看 | 欧美一区1区三区3区公司| 国产精品亚洲аv天堂网| 欧美影院午夜播放| 久久精品电影| 一区二区三区免费看| 久久激五月天综合精品| 亚洲国产va精品久久久不卡综合| 亚洲国产另类精品专区| 欧美日韩不卡在线| 欧美一级专区免费大片| 午夜亚洲伦理| 亚洲日韩第九十九页| 亚洲视频免费在线| 在线精品一区| 午夜在线成人av| 美国十次成人| 国产一区av在线| 羞羞视频在线观看欧美| 久久久久久久久久久久久女国产乱 | 久久久99国产精品免费| 亚洲午夜伦理| 久久爱www久久做| 亚洲人www| 亚洲永久字幕| 亚洲激情成人| 伊人狠狠色j香婷婷综合| 一本久久a久久免费精品不卡| 极品裸体白嫩激情啪啪国产精品| 亚洲天堂av电影| 亚洲视屏在线播放| 欧美日本韩国一区二区三区| 欧美成熟视频| 亚洲电影毛片| 久久久亚洲成人| 久久伊人免费视频| 国产一区二区三区免费不卡| 亚洲免费在线视频| 欧美专区在线观看一区| 国产精品视频区| 亚洲一区www| 亚洲欧美日韩天堂| 国产精品视频男人的天堂| 一区二区三区四区五区精品视频 | 国产精品羞羞答答| 亚洲综合欧美日韩| 性做久久久久久久久| 国产精品免费小视频| 在线性视频日韩欧美| 亚洲免费影视| 国产伦精品一区二区三区高清版 | 亚洲专区一区| 久久久久国产成人精品亚洲午夜| 国产欧美一区二区精品仙草咪| 亚洲欧美激情精品一区二区| 久久国产精品高清| 狠狠色狠狠色综合日日五| 久久精品亚洲一区二区| 男人的天堂成人在线| 日韩一本二本av| 国产精品欧美激情| 久久九九有精品国产23| 亚洲福利视频一区| 中文日韩欧美| 国产一区欧美| 欧美激情精品久久久六区热门 | 欧美久久视频| 亚洲香蕉在线观看| 久久蜜桃资源一区二区老牛| 亚洲丰满少妇videoshd| 欧美日本国产一区| 午夜日韩激情| 亚洲黄色精品| 欧美影院在线播放| 亚洲人成网站在线观看播放| 欧美日韩一级黄| 午夜精品99久久免费| 欧美成人第一页| 欧美一级在线播放| 亚洲精品免费看| 国产精品美女主播| 久久综合网色—综合色88| 99精品福利视频| 女人香蕉久久**毛片精品| 亚洲午夜黄色| 亚洲电影一级黄| 国产精品一区二区你懂得| 久久综合色婷婷| 亚洲影院污污.| 欧美大片专区| 欧美中文在线视频| 99视频一区| 在线欧美三区| 国产欧美一区二区视频| 欧美精品三区| 久久精品最新地址| 亚洲女女女同性video| 亚洲国产精品高清久久久| 久久成人18免费观看| 99精品视频免费| 亚洲第一天堂av| 国产精品午夜在线| 欧美日韩xxxxx| 免费看亚洲片| 久久精品视频亚洲| 午夜精品一区二区三区电影天堂| 亚洲国产精品久久91精品| 久久久精品2019中文字幕神马| 99这里只有精品| 亚洲精品一区二区网址| 国内外成人在线| 国产欧美日韩在线观看| 久久精品日韩一区二区三区| 99国产一区| 亚洲精品一二| 最新69国产成人精品视频免费| 一区二区三区在线观看视频| 国产拍揄自揄精品视频麻豆| 国产精品久久久久毛片软件| 欧美私人网站| 国产精品免费在线| 国产精品一级二级三级| 国产精品专区第二| 国产亚洲欧美日韩在线一区| 国产九九精品视频| 国产在线不卡| 怡红院av一区二区三区| 亚洲大黄网站| 亚洲伦理在线观看| 99视频精品全国免费| 亚洲一区二区少妇| 欧美精品福利视频| 欧美深夜福利| 国产精品亚洲综合| 国语精品一区| 亚洲二区视频| 99re6热在线精品视频播放速度| 亚洲人成人77777线观看| 亚洲高清成人| 亚洲裸体俱乐部裸体舞表演av| 亚洲精品欧美日韩专区| 亚洲免费观看高清完整版在线观看熊 | 欧美极品一区| 欧美精品在线看| 欧美日韩美女| 国产精品视频| 国产亚洲电影| 伊人久久久大香线蕉综合直播| 国内精品嫩模av私拍在线观看 | 亚洲午夜av在线| 欧美一级黄色网| 久久久久久亚洲精品中文字幕| 久久久xxx| 好吊妞这里只有精品|