国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
XSL:轉(zhuǎn)換從哪里開始?

XSL:轉(zhuǎn)換從哪里開始?
前言
愛好XML的人最終會(huì)試著將轉(zhuǎn)換XML為HTML,或者轉(zhuǎn)換為其他類型的文檔,DOM/SAX顯然不是專門為轉(zhuǎn)換設(shè)計(jì)的,CSS對(duì)于轉(zhuǎn)換也是力有不逮,所以XML的愛好者們幾乎無一例外的要遭遇XSL,但是XSL似乎有非常多的用法,對(duì)于XML僅僅只是表示格式化的數(shù)據(jù)而言,XSL顯得復(fù)雜且毫無頭緒。

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

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文檔的轉(zhuǎn)換和顯示特征的推薦標(biāo)準(zhǔn),它包括三個(gè)部分:XSL轉(zhuǎn)換(XSLT)是一種為了轉(zhuǎn)換XML而定義的語言;XML路徑語言(XPath)是一種表達(dá)式語言,它被XSLT用來訪問或者提交一個(gè)XML文檔的某些部分(XPath也同時(shí)被XML Linking標(biāo)準(zhǔn)使用);XSL格式化對(duì)象(XSL-FO)是一個(gè)XML詞匯表用來定義XML的格式化語義。

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

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="‘ target=_blank>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文件,則會(huì)看到轉(zhuǎn)換后的效果。當(dāng)然用XMLSPY中自帶的瀏覽器也可。

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

   <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的瀏覽器中打開,即可看到如前一段執(zhí)行的結(jié)果。當(dāng)然不僅僅是Jscript,其他的腳本語言如VBScript等等也可以,不過Jscript是XSL默認(rèn)的腳本語言。

腳本擴(kuò)充的XSL,令人疑惑的xsl:eval標(biāo)記
    xsl:eval標(biāo)記并不是一個(gè)標(biāo)準(zhǔn)的xsl標(biāo)記,它屬于http://www.w3.org/TR/WD-xsl這個(gè)名字空間,這個(gè)名字空間最終被微軟采用,于是xsl:eval也被微軟用來調(diào)用Jscript腳本,以此來擴(kuò)充XSL的功能。而標(biāo)準(zhǔn)的XSL1.0版本的名字空間是http://www.w3.org/1999/XSL/Transform,它并不包含xsl:eval標(biāo)記,這是很容易理解的,XSL應(yīng)該屬于一個(gè)平臺(tái)無關(guān)的技術(shù),如果它的某個(gè)標(biāo)記要依賴微軟公司的產(chǎn)品,那顯然是自掘墳?zāi)?。關(guān)于平臺(tái)無關(guān)的討論,將在本文的最后展開。

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

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

<xsl:stylesheet version="1.0" xmlns:xsl="‘ target=_blank>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>合計(jì)</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)即可看到結(jié)果,注意這個(gè)xsl文件的這一行<xsl:stylesheet version="1.0" xmlns:xsl="‘ target=_blank>http://www.w3.org/TR/WD-xsl">,寫錯(cuò)了名字空間xsl:eval標(biāo)記就會(huì)報(bào)錯(cuò)。

瀏覽器無關(guān)的XSL解決方案,服務(wù)端的XSL
不管如何折騰,要將XML通過XSL轉(zhuǎn)換為HTML必須要求本地主機(jī)上有一個(gè)XSL解析器,不管是瀏覽器內(nèi)嵌的,還是可以通過腳本語言調(diào)用。那么,更好的解決方案當(dāng)然是從服務(wù)器端直接發(fā)送HTML回來,這樣無論什么瀏覽器都可以看到轉(zhuǎn)換的結(jié)果了。ASP提供了這個(gè)功能,這是可想而知的,不過我對(duì)ASP不熟,這段略過,有興趣的可以找本ASP的XML教材看看。

應(yīng)用程序中的XSL,語言相關(guān)的XSL
眾所周知,Java是對(duì)XML技術(shù)支持得最好的語言,Java上面的xml包非常多,其中支持XSL轉(zhuǎn)換的包最著名的有Saxon和xalan。Saxon包可以在http://saxon.sourceforge.net/上面下載。將Saxon包解壓縮到C:\saxon6_5_3,6.5.3版本提供了對(duì)XSL1.0最穩(wěn)定的支持。然后在Classpath中加入C:\saxon6_5_3\saxon.jar;C:\saxon6_5_3\saxon-jdom.jar。

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

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

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

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

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

下面是在Java程序中調(diào)用Saxon包,進(jìn)行XSL轉(zhuǎn)換的例子,文件名為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();

        }

       }

}

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

數(shù)據(jù)是獨(dú)立的,處理是平臺(tái)相關(guān)的
    總結(jié)前面的內(nèi)容,可以看出XSL轉(zhuǎn)換可以從這幾個(gè)地方開始:

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

Ø         JScript,顯式調(diào)用XSL解析器;

Ø         用JScript擴(kuò)充XSL功能,半吊子的XSL;

Ø         瀏覽器無關(guān)的XSL解決方案,服務(wù)器端的XSL,ASP顯式調(diào)用XSL;

Ø         語言相關(guān)的XSL,Java的XSL包Saxon,xalan。

可以看出來,XSL無論如何,都是要平臺(tái)相關(guān)的,第一種方法依賴嵌入瀏覽器的XSL解析器;第二、三種方法依賴操作系統(tǒng)安裝的XSL解析器;第四種方法依賴服務(wù)器端安裝的XSL解析器;最后的方法依賴JAVA語言提供的XSL API。其中微軟還不顧W3C的反對(duì),自定義了XSL的腳本擴(kuò)充功能,功能倒是強(qiáng)大了,可惜脫離了Windows就玩不轉(zhuǎn)了。JAVA號(hào)稱平臺(tái)無關(guān),可是JAVA本身就是一個(gè)平臺(tái),要是有人的機(jī)器沒有JRE又怎么辦呢?丟棄XSL?

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

以上的討論都是基于XSL1.0標(biāo)準(zhǔn)的,目前XSL2.0標(biāo)準(zhǔn)尚在討論中,不過初稿已經(jīng)發(fā)布了,而Saxon8.0以上的版本號(hào)稱已經(jīng)支持了XSL2.0。讓我們拭目以待XSL2.0帶給我們的驚喜。

參考文獻(xiàn)
W3C站點(diǎn):http://www.w3.org/Style/XSL/

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

中文譯文站點(diǎn):http://www.opendl.com/

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

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
XSLT Transformations with the XslTransform Cl...
Eclipse報(bào)錯(cuò)"No embedded stylesheet instruction for file"的解決方法
xml+asp+xsl實(shí)現(xiàn)wap1.2和html頁面輸出
XML復(fù)習(xí)題
XSLT初步
通過DOM操作XML數(shù)據(jù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服