欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
為什么要擴展Xslt樣式表功能
基于Xml的可擴展樣式表語(yǔ)言Xsl及其轉換Xslt實(shí)現了將Xml源文件從一種格式到另一種格式的轉換。通過(guò)在xsl文件中定義一系列遵守規則的模板,匹配這些模板的Xml文檔部分就能夠被轉換為可顯示的Html頁(yè)面文件、符合其他需要的Xml文件或除此之外其他結構的文件。當在Xslt文檔中這樣做時(shí),沒(méi)有明顯的流程控制,也沒(méi)有傳統編程意義上的算法,甚至不需要任何程序代碼和編程語(yǔ)言。絕大多數時(shí)候,這能夠很好地完成任務(wù)。
任何一門(mén)語(yǔ)言都不可能絕對完善,而Xsl畢竟只是一門(mén)標記語(yǔ)言,單純依靠它并不能完成所有任務(wù)。如同沒(méi)有XPath、Xslt時(shí),Xml充其量只能是一些標記的集合,什么也不能做一樣。尤其,如果我們所需求的不僅僅是改變文檔的顯示方式或結構,我們還需要對文檔進(jìn)行更多的控制時(shí),單純使用Xslt的局限性就暴露出來(lái)了。比如,獲取用戶(hù)鍵入的參數以控制轉換輸出、連接外部數據源以及引用某種計算的結果等等,這些情況下,單純使用Xslt這樣的描述語(yǔ)言無(wú)法提供滿(mǎn)意的解決方案。而我們知道,程序代碼會(huì )很輕易地解決這些問(wèn)題。
使用嵌入式腳本擴展Xslt樣式表功能
Xml是易于擴展的,這也正是其短時(shí)間內能被廣泛接受的原因之一。而Xslt完全基于xml實(shí)現,它應該也是易于擴展的。事實(shí)的確如此,W3C推薦標準的Xslt提供了針對不同處理器/解析器的專(zhuān)門(mén)的擴展?;旧?,不同處理器/解析器可以在Xpath表達式、Xslt模板主體內容或頂級元素中使用擴展函數。而且,同任何程序語(yǔ)言的函數/方法一樣,這些擴展函數可以用來(lái)完成所要求的子功能,它們也能夠“一次定義,多次調用”。更重要地,這些嵌入腳本函數不僅能在xslt標記語(yǔ)言中調用,還能夠運用在高級語(yǔ)言中。腳本語(yǔ)言所提供的組功能比純Xslt所提供的功能更豐富,經(jīng)??梢杂脕?lái)對文檔內容進(jìn)行更復雜的操作(例如對其應用科學(xué)計算或訪(fǎng)問(wèn)外部信息源等),這個(gè)特性大大擴展了xslt的功能。
實(shí)現時(shí),需要在一個(gè)指定的命名空間中限定所創(chuàng )建的擴展函數,并且在特定的Xslt處理器中提供實(shí)現。之所以必須使用命名空間,是因為命名空間不僅可以防止不同來(lái)源的Xslt名稱(chēng)間的沖突。更重要的是它還將擴展予以標識,這樣其他的處理器就可以忽略這個(gè)專(zhuān)門(mén)針對特定處理器的實(shí)現,并依靠這個(gè)命名空間在Xslt其他部分引用擴展函數。
MSXML XSLT處理器使用<msxsl:script>元素及其屬性implements-prefix實(shí)現并擴展函數以提供腳本級支持。微軟特別指定的命名空間允許MSXML XSLT處理器在樣式表內定位腳本代碼。<msxsl:script>元素的language屬性告訴運行期腳本使用哪個(gè)解釋程序,而implements-prefix屬性值是擴展函數的前綴,這個(gè)前綴xslt文檔的其他地方被聲明。定義這些屬性之后,Xslt處理器就能夠使用這些信息調用解釋器運行時(shí)腳本(如C#編譯器)并在<msxsl:script>元素中實(shí)現擴展函數的代碼編寫(xiě)。在樣式表的其他地方,依靠<xsl:value-of>元素提供輸出的模板通過(guò)seletct屬性與擴展函數相關(guān)聯(lián),比如,執行并輸出擴展函數的計算結果。
<msxsl:script>元素定義如下:
<msxsl:script language="language-name" implements-prefix="prefix of user‘s namespace"></msxsl:script>
其中:
language屬性表示語(yǔ)言選項,它與html頁(yè)面上script元素的language屬性極為類(lèi)似,其值提供函數/方法定義所用的腳本語(yǔ)言。不過(guò),language屬性不是必須的,但如果指定,則它的值必須是下列語(yǔ)言之一:C#、VB、JScript、JavaScript、VisualBasic或CSharp。如果未指定,則默認語(yǔ)言為JScript。與其他Xslt元素及屬性嚴格區分大小寫(xiě)不同的是,這里的語(yǔ)言名稱(chēng)不區分大小寫(xiě),因此,"JavaScript"和"javascript"是等效的。
implements-prefix屬性是強制的。用于指定命名空間前綴并將其與腳本塊關(guān)聯(lián)。屬性的值表示命名空間前綴。前綴所代表的命名空間必須在樣式表中的某個(gè)位置定義。
同其他任何Xml元素標記一樣,<msxsl:script>元素中的"msxsl"表示命名空間前綴。不過(guò),名字"msxsl"并不重要,也就是說(shuō),并不一定非是"msxsl"不可,你一樣可以命名為其他的字符串,比如:
xmlns:myxsl="urn:schemas-microsoft-com:xslt" xmlns:myns="urn:schemas-microsoft-com:xslt"
這樣,命名空間前綴變?yōu)榱?myxsl"或者"myns",相應地,元素<msxsl:script>就將改為<myxsl:script>或<myns:script>。這種改變不會(huì )對結果有什么影響,如果你在你的xslt文檔所有部分保持一致的話(huà)。(在本文中,所有出現<script>元素的地方使用了msxsl,是為了與微軟默認設置保持一致)
不知你是否已經(jīng)注意到,上面的語(yǔ)句中,不管命名空間前綴怎樣改變,其值卻始終是urn:schemas-microsoft-com:xslt。這是必須的。要正確擴展xslt樣式表功能,就必須指定這個(gè)命名空間。命名空間urn:schemas-microsoft-com:xslt符合W3C推薦標準,并在微軟MSXML3.0以上處理器中提供支持。使用它不僅能在xslt中進(jìn)行嵌入腳本編程,還能對其他擴展功能提供支持。比如,在xsl中使用node-set()函數。
通常,在<xsl:stylesheet>元素內定義<msxsl:script>元素,然后在<msxsl:script>元素內定義擴展函數,還可以在<msxsl:script>中實(shí)例化COM對象,這將大大擴展純Xslt的功能。(不過(guò),用戶(hù)的安全設置或許會(huì )阻止你的腳本實(shí)例化客戶(hù)端對象)
擴展函數包含在<msmsl:script>元素所定義的腳本塊中。樣式表可包含多個(gè)腳本塊,各腳本塊的操作相互獨立。也就是說(shuō),如果在腳本塊的內部執行,則無(wú)法調用在其他腳本塊中定義的函數,除非該腳本塊聲明為具有同一命名空間和同一腳本語(yǔ)言。由于每個(gè)腳本塊都可以使用自己的語(yǔ)言,因此腳本塊的分析將遵照該語(yǔ)言分析器的語(yǔ)法規則進(jìn)行。使用的語(yǔ)法對于所用的語(yǔ)言而言必須是正確的。例如,如果使用的是 C# 腳本塊,則在該塊中使用 XML 注釋節點(diǎn) <!-- an XML comment --> 是錯誤的,應該使用C#注釋符"http://"或者"/*…*/"。
下面的例子建立一個(gè)附帶名字空間前綴"mycompany"的腳本塊,腳本中包含一個(gè)"sum"的函數,該函數接受兩個(gè)double類(lèi)型參數,并計算它們的和,然后轉換成字符串輸出。隨后,xsl元素<xsl:value-of>的select屬性調用這個(gè)函數并輸出結果。
<?xml version="1.0" encoding="utf-8" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:mycompany="http://mycompany.com/mynamespace" version="1.0"> <msxsl:script language="c#" implements-prefix="mycompany"> private string sum(double a,double b) { return (a+b).ToString(); } </msxsl:script> <xsl:template match="/"> <xsl:value-of select="mycompany:sum(5.0,10.0)"/> </xsl:template></xsl:stylesheet>
為演示效果,在<xsl:value-of select="mycompany:sum(5,10)" />中調用擴展函數sum時(shí),硬性編碼了兩個(gè)double值5.0和10.0,實(shí)際中,參數取值應該來(lái)自于xml源文檔或者通過(guò)自定義參數傳入。
鑒于xml元素內容的特殊要求,即它不能直接包含"、‘、<、>、&等字符以及所有非顯示字符,而給定語(yǔ)言的運算符、標識符或分隔符恰好可能包含這些字符,它們有可能被錯誤地解釋為XML。而將所有這些字符完全替換成對應的實(shí)體(標準實(shí)體和字符實(shí)體)引用將降低xml文件的可讀性。所以,在使用 msxsl:script 元素時(shí),強烈建議無(wú)論使用何種語(yǔ)言,都將腳本放置在 CDATA 節內。例如,下面的 XML 顯示放置代碼的 CDATA 節的模板。
<msxsl:script implements-prefix=‘myScript‘ language=‘c#‘> <![CDATA[ <!--在這里放置代碼--> ]]></msxsl:script>
例如,下面的示例顯示如何在腳本中使用邏輯 AND 運算符。
<msxsl:script implements-prefix=‘myScript‘ language=‘c#‘> public string book(string abc, string xyz) { if ((abc== abc)&&(abc== xyz)) return bar+xyz; else return null; }</msxsl:script>
由于"&"符沒(méi)有轉義,因此這將引發(fā)異常。將文檔作為 XML 加載,并且不對 msxsl:script 元素標記之間的文本運用任何特殊處理。
.Net中使用帶擴展功能的Xslt樣式表
.Net中的Xslt轉換對象提供了對在Xslt文檔中用腳本擴展元素來(lái)嵌入腳本語(yǔ)言的支持。XslTransform類(lèi)專(zhuān)門(mén)為此提供實(shí)現。它包含的方法使用 Xslt樣式表轉換 Xml 數據為指定的輸出。其中,用于載入Xslt轉換文檔的XslTransform..Load()方法接受包含嵌入腳本的樣式表,實(shí)際執行轉換的XslTransform.Transform()方法使用這個(gè)樣式表將Xml源文檔轉換為指定的輸出。在這里,源Xsl文檔是否包含嵌入腳本并不影響程序代碼的編寫(xiě),你不需要為此額外添加代碼。也就是說(shuō),在高級語(yǔ)言中編寫(xiě)程序代碼時(shí),包含嵌入腳本的Xsl文檔與不包含嵌入腳本的Xsl文檔使用一樣的轉換語(yǔ)句。
XslTransform類(lèi)支持使用<msxsl:script>元素的嵌入腳本撰寫(xiě)。加載樣式表時(shí),任何已定義的函數均通過(guò)包裝在類(lèi)定義中被編譯為Microsoft中間語(yǔ)言(MSIL),因此不會(huì )有任何性能損失。
綜合上面的知識,下面使用Visual Studio.Net SDK創(chuàng )建了一個(gè)控制臺應用程序UseXsltScript,該程序調用包含嵌入腳本的trans.xsl轉換文檔,對data.xml源文檔執行轉換,并將結果輸出到一個(gè)新的newxml.xml文件。該例中的Xslt嵌入腳本用來(lái)計算已知三角形底邊及該邊對應高度的情況下,計算此三角形的面積。
using System;using System.Xml;using System.Xml.Xsl;using System.IO;namespace MyCompanyUri.UseXsltScript{ class Xslt { private const string xmlfile = "../../data.xml";//xml源文檔 private const string xslfile = "../../trans.xsl";//xsl轉換文檔 private const string newxml="../../outxml.xml";//轉換后的xml文檔 public static void Main() { XmlDocument doc=new XmlDocument();//實(shí)例化xml文檔對象 doc.Load(xmlfile);//加載xml文檔 XslTransform xslt = new XslTransform(); //實(shí)例化XsltTransform轉換類(lèi)對象 xslt.Load(xslfile);//加載xslt轉換樣式表 FileStream myStream=new FileStream(newxml,FileMode.OpenOrCreate);//以流方式打開(kāi)文件 XmlTextWriter writer = new XmlTextWriter(myStream,null);//實(shí)例化xml編寫(xiě)器并提供控制臺輸出 writer.Formatting = Formatting.Indented;//設置輸出的縮進(jìn)格式 xslt.Transform(doc, null, writer);//轉換xml文檔并輸出 writer.Close(); } }}
xml源文件data.xml:
<?xml version="1.0" encoding="utf-8" ?><triangles> <triangle> <size> <width>2</width> <height>4</height> </size> </triangle> <triangle> <size> <width>13</width> <height>8</height> </size> </triangle></triangles>
trans.xsl文件:
<?xml version="1.0" encoding="utf-8" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:myscript="urn:myns"> <msxsl:script language="C#" implements-prefix="myscript"> <![CDATA[ public double triangleArea(double width,double height){ double area = width*height/2;//面積公式:(底*高)/2 return area;//返回三角形面積 } ]]> </msxsl:script> <xsl:template match="http://triangles"> <triangles> <xsl:for-each select="triangle/size"><!--選定size節點(diǎn)--> <triangle> <xsl:copy-of select="../size" /><!--復制size節點(diǎn) --> <area> <xsl:value-of select="myscript:triangleArea(width,height)" /><!--調用函數--> </area> </triangle> </xsl:for-each> </triangles> </xsl:template></xsl:stylesheet>
執行這個(gè)控制臺程序,在應用程序目錄的相應地方將生成outxml.xml文件。它將包含給定三角形的底邊、高度尺寸及對應的面積。
另外,運行這個(gè)應用程序的時(shí)候你能夠明顯感覺(jué)到程序產(chǎn)生了短暫的延遲。這是因為在裝入樣式表處理嵌入式腳本之前,必須先裝入c#編譯器并運行該嵌入式c#腳本,這將花費2秒左右的時(shí)間。
需要注意的是:Xslt嵌入腳本中擴展函數的參數及函數返回值必須是 W3C XPath 類(lèi)型之一,這些類(lèi)型并不與.Net所支持的類(lèi)型完全一致(關(guān)于這些W3C Xpath類(lèi)型和.Net類(lèi)型的對應情況請參見(jiàn)MSDN)。如果腳本函數使用其他的類(lèi)型,或者,如果函數在樣式表加載到 XslTransform 對象中時(shí)不進(jìn)行編譯,則將引發(fā)異常。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
在.Net中使用msxsl:script腳本塊擴展XSLT的具體實(shí)踐與應用_.NET Es...
XSLT轉換XML小結
用于數據的 XML: XPath 2.0 有哪些新特性?
PHP5中使用XSLT擴展
XML認證教程,第 4 部分: XSL樣式單
從一個(gè)范例看XML的應用
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久