一概述
XSLT可以用于將XML格式的數(shù)據(jù)轉(zhuǎn)換為其它格式,在數(shù)據(jù)和展示分開(kāi)以及數(shù)據(jù)相互轉(zhuǎn)換中可以得到廣泛的應(yīng)用,比較典型的是以前的動(dòng)網(wǎng)論壇模板系統(tǒng)以及動(dòng)易的標(biāo)簽系統(tǒng)。掌握好XSLT可以靈活的處理XML,同時(shí)運(yùn)用在Web應(yīng)用程序中也非常的方便,不過(guò)缺點(diǎn)是使用者需要掌握大量的XPath、XSLT、XML等相關(guān)知識(shí)。
在XSLT中,可以直接使用腳本語(yǔ)言如Javascript輸出到Html中,進(jìn)行相關(guān)的客戶端操作,由于一些限制,XSLT提供的函數(shù)可能不能達(dá)到一些復(fù)雜的數(shù)據(jù)處理效果,這個(gè)時(shí)候就需要使用擴(kuò)展腳本塊的功能,這樣就可以使用C#等強(qiáng)類型的語(yǔ)言進(jìn)行相關(guān)的數(shù)據(jù)處理工作。
在.Net中可以進(jìn)行XSLT轉(zhuǎn)換功能的類是XslCompiledTransform ,具體參考msdn.microsoft.com/zh-tw/library/system.xml.xsl.xslcompiledtransform(zh-cn).aspx
關(guān)于本文敘述的內(nèi)容可以參考http://msdn.microsoft.com/zh-tw/library/wxaw5z5e(zh-cn).aspx
關(guān)于Xslt以及XPath可在網(wǎng)上參考相關(guān)文檔。
二實(shí)現(xiàn)msxsl:script的功能
下面舉一個(gè)例子實(shí)現(xiàn)該功能
1,新建一Web應(yīng)用程序項(xiàng)目
2,在項(xiàng)目中添加一個(gè)Xml文件News.xml,內(nèi)容如下:
<?xml version="1.0" encoding="utf-8" ?>
<AllNews>
<News Author="Raymond">
<Title>測(cè)試新聞標(biāo)題1test test</Title>
<Content>這里是新聞的內(nèi)容...</Content>
</News>
<News Author="Jack">
<Title>測(cè)試新聞標(biāo)題2 test test test</Title>
<Content>這里是新聞的內(nèi)容...</Content>
</News>
<News Author="Tom">
<Title>測(cè)試新聞標(biāo)題3 test test test test</Title>
<Content>這里是新聞的內(nèi)容...</Content>
</News>
</AllNews>
3,新建一個(gè)Xslt文件News.xslt,用于將Xml轉(zhuǎn)換為Html內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www./1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<xsl:call-template name="style"/>
<xsl:call-template name="showNews">
<xsl:with-param name="news" select="AllNews/News"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="style">
<style>
.title{font-size:14px;font-weight:bold;color:White;background-color:#000000;}
div.newsBlock{border:1px dashed #000000;padding:5px;margin-bottom:10px;background-color:Gray;}
div.content{text-indent:2em;}
</style>
</xsl:template>
<!--展示新聞-->
<xsl:template name="showNews">
<xsl:param name="news"/>
<xsl:for-each select="$news">
<div class="newsBlock">
<div class="title">
<xsl:value-of select="Title"/>
</div>
<div class="content">
<xsl:value-of select="Content"/>(<xsl:value-of select="@Author"/>)
</div>
</div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
4,在Web項(xiàng)目的Default.aspx.cs中添加解析Xml的代碼并且輸出:
添加代碼如下:
protected void Page_Load(object sender, EventArgs e)
{
this.ShowNews();
}
/// <summary>
/// 轉(zhuǎn)換Xml并且顯示新聞
/// </summary>
private void ShowNews()
{
//實(shí)例化
XslCompiledTransform transform = new XslCompiledTransform();
//加載樣式表
transform.Load(Server.MapPath("News.xslt"));
//轉(zhuǎn)換并且輸出
transform.Transform(Server.MapPath("News.xml"), null, Response.OutputStream);
}
瀏覽Default.aspx 我們可以看到效果如下:
這樣數(shù)據(jù)就正確的顯示出來(lái)了
5,添加腳本塊
我們?cè)囅胍环N情況,Xml中的一些數(shù)據(jù)可能通過(guò)xslt的函數(shù)無(wú)法處理那么這個(gè)時(shí)候我們需要借助于其他語(yǔ)言進(jìn)行處理,這個(gè)時(shí)候我們可以考慮使用擴(kuò)展腳本塊來(lái)實(shí)現(xiàn)。
這里舉一個(gè)例子,我們將新聞的標(biāo)題僅顯示前邊7個(gè)字符,我們通過(guò)擴(kuò)展的C#函數(shù)來(lái)處理(當(dāng)然直接通過(guò)xslt的substring可以直接處理,這里僅舉例而已,在一些情況下xslt自帶函數(shù)無(wú)法實(shí)現(xiàn)很多跟業(yè)務(wù)邏輯層、數(shù)據(jù)層等相關(guān)的操作的情況下可以使用此方法)。
5.1,新建一個(gè)類庫(kù)項(xiàng)目AssemblyTest
添加類XsltTest
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AssemblyTest
{
public class XsltTest
{
/// <summary>
/// 返回縮減的標(biāo)題
/// </summary>
/// <param name="title"></param>
/// <returns></returns>
public static string GetTitle(string title)
{
return title.Substring(0, 7);
}
}
}
5.2在Web應(yīng)用程序中添加對(duì)AssemblyTest類庫(kù)項(xiàng)目的引用
5.3修改News.xslt內(nèi)容為
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www./1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:pl="http://www./xslt/example">
<msxsl:script language