生活随笔
收集整理的這篇文章主要介紹了
如何在XSLT里调用C#的代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有兩種方法:1)內嵌腳本, 2)使用擴展對象
使用內嵌腳本的方法,MSDN上已經有比較清楚的描述:?Script Blocks Using msxsl:script。但對擴展對象的描述好像并不清晰。其實擴展對象比內嵌更為強大。舉個例子,假設我們想知道自己所關心城市的天氣,我們用一個xml來描述:
<?xmlversion="1.0"encoding="utf-8"??> <china> <city>Shanghai</city> <city>Beijing</city> </china>???????
在這里我們想知道上海和北京兩地的天氣,并希望通過一個XSLT來轉換出如下結果:
<Report>
<Cityname="Shanghai">多云</City> <Cityname="Beijing">小雨</City> </Report>
天氣預報是通過調用一個web服務得到的。可以想象,單純的XSLT絕對沒辦法把這事簡單搞定。不過通過擴展對象,這件事情就變得異常簡單了。
首先我們創建一個擴展對象:
public?class?WeatherReport { public?string?GetReport(string?city) { return?"weather of "?+ city; } }
這個對象支持一個方法:根據城市名稱返回其天氣。為簡單起見,我們返回"weather of"加城市名字。在具體的應用中可以去調用具體的web服務。
下面這段代碼實現將結果輸出到屏幕上:
private?static?void?ShowWeather(string?xmlFile,?string?xsltFile) { XmlDocument?xmldoc =?new?XmlDocument(); xmldoc.Load(xmlFile); XmlDocument?xsltDoc =?new?XmlDocument(); xsltDoc.Load(xsltFile); XslCompiledTransform?xslt =?new?XslCompiledTransform(); xslt.Load(xsltDoc.CreateNavigator()); XmlTextWriter?writer =?new?XmlTextWriter(Console.Out); writer.Formatting =?Formatting.Indented; XsltArgumentList?xsltArgList =?new?XsltArgumentList(); xsltArgList.AddExtensionObject("urn:my.xslt.extension",?new?WeatherReport()); xslt.Transform(xmldoc, xsltArgList, writer); writer.Close(); }
大部分代碼和其他的都相同,不同的地方就是,需要將擴展對象作為參數傳到你的XSLT里:
??????????? xsltArgList.AddExtensionObject("urn:my.xslt.extension",?new?WeatherReport());
下面是XSLT文本:
<?xmlversion="1.0"encoding="UTF-8"??> <xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:code="urn:my.xslt.extension" > <xsl:outputmethod="xml"indent?="yes"/> <xsl:templatematch="china"> <xsl:elementname="Report"> <xsl:apply-templatesselect="city"?/> </xsl:element> </xsl:template> <xsl:templatematch="china/city"> <xsl:elementname="City"> <xsl:attributename="name"> <xsl:value-ofselect="."/> </xsl:attribute> <xsl:value-ofselect="code:GetReport(.)"/> </xsl:element> </xsl:template> </xsl:stylesheet>
其他都一樣,不同的是,我們需要定義擴展對象的命名空間
????????????????xmlns:code?="urn:my.xslt.extension"
這個就是我們在代碼AddExtensionObject傳進去的命名空間
另外就是調用:
??????????????????????? <xsl:value-ofselect?="code:GetReport(.)"/>
其實擴展對象的威力遠遠不止這些,你還可以接受一個XPathNodeIterator來處理節點樹,甚至返回一個新的XPathNodeIterator讓XLST做處理。
出處:http://blog.csdn.net/hiaspx/article/details/3620338
轉載于:https://www.cnblogs.com/mq0036/archive/2012/07/18/2597672.html
總結
以上是生活随笔為你收集整理的如何在XSLT里调用C#的代码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。