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

流量統(tǒng)計(jì):
Rixu Blog (日需博客)
日需博客,每日必需來踩踩哦..
posts - 108,comments - 54,trackbacks - 0

大家說我說的跟.net一點(diǎn)關(guān)系都沒有,可是第一篇我也說了啊,僅僅是一個(gè)HELLO的例子啊。現(xiàn)在哪個(gè)人不忙啊。只能一點(diǎn)一點(diǎn)的寫了。。

好了,廢話少說,我們先看看實(shí)際的情況,然后根據(jù)情況來寫一個(gè)小小的例子吧,這次有Demo下載嘍。。。

現(xiàn)實(shí)項(xiàng)目中的情況:

現(xiàn)實(shí)的項(xiàng)目中,我們不可能是有著一堆的XML的,這些XML有可能一部分是來自于現(xiàn)有的文檔,有一部分可能是從其它服務(wù)提供者那里得到的,當(dāng)然也有可能是自己寫的服務(wù)提供的……

總之一句話,不到真正開始了,天曉得xml是哪里來的。

現(xiàn)實(shí)很殘酷,我們也很聰明,辦法總是有的,而且非常簡單,這里我建立了一個(gè)Index.xml,一個(gè)Index.xslt文件放到網(wǎng)站的Album目錄中:

可以通過一個(gè)配置文檔來配置所有XML的URL,從而增進(jìn)可維護(hù)性。

Index.xml文件的內(nèi)容:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="Index.xslt"?>
<services>
<album>XML FILE URL</album>
</services>

Index.xslt文件的內(nèi)容:

<?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" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>
<xsl:template match="services">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Index</title>
</head>
<body>
<h1>
<xsl:value-of select="album"/>
</h1>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

當(dāng)確認(rèn)上述兩敗個(gè)文檔都正確建立后,再建立一個(gè)Index.ashx文件,用于提供XML數(shù)據(jù),并且將Index.xml文件的album元素的值改為Index.ashx的URL。

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/xml";
context.Response.ContentEncoding = Encoding.UTF8;
List<Album> albums = new AlbumBusiness().Select("ArtistId=1");
XmlSerializer albumXmlSerializer = new XmlSerializer(albums.GetType(), new XmlRootAttribute("Albums"));
albumXmlSerializer.Serialize(context.Response.OutputStream, albums);
}

準(zhǔn)備工作都做好了,看看輸出的XML大致的樣式吧:

<?xml version="1.0"?>
<Albums xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Album>
<AlbumId>386</AlbumId>
<GenreId>1</GenreId>
<ArtistId>1</ArtistId>
<Title>For Those About To Rock We Salute You</Title>
<Price>8.99</Price>
<AlbumArtUrl>/Content/Images/placeholder.gif</AlbumArtUrl>
</Album>
<Album>
<AlbumId>387</AlbumId>
<GenreId>1</GenreId>
<ArtistId>1</ArtistId>
<Title>Let There Be Rock</Title>
<Price>8.99</Price>
<AlbumArtUrl>/Content/Images/placeholder.gif</AlbumArtUrl>
</Album>
</Albums>

XSL通過variable標(biāo)記聲明變量。

這里要說到xsl和變量和函數(shù)了,將下面的內(nèi)容添加到Index.xslt文檔的template下面:

<xsl:variable name="AlbumServiceUrl" select="album"></xsl:variable>
<xsl:variable name="Albums" select="document($AlbumServiceUrl)/Albums/Album"></xsl:variable>

xsl:variable 標(biāo)記用于聲明變量。其name屬性用于指定此變量的名稱,select屬性用于選擇變量的內(nèi)容,在這里不難看出,它是選擇了services節(jié)點(diǎn)下的album節(jié)點(diǎn)的值。這里使用的是相對(duì)path。其文檔來源由所在的template來決定。

Albums變量的select中使用了document函數(shù),此函數(shù)使用一個(gè)文檔路徑的參數(shù)來載入一個(gè)xml文檔。其后面跟著的“/Albums/Album” XPpath指定了選擇我們指定的那個(gè)文檔下面所有的Album節(jié)點(diǎn)存放在此變量中。

在XSL中,引用變量的方式是在變量名前面加一個(gè)$符號(hào)。

如上面的$AlbumServiceUrl.

接下來要輸出些東西了,我們還要再看一個(gè)新的XSL標(biāo)記:xsl:for-each:

<ul>
<xsl:for-each select="$Albums">
<li>
<xsl:value-of select="Title"/>
</li>
</xsl:for-each>
</ul>

前面已經(jīng)說過,我們是把所有Album節(jié)點(diǎn)都存到了Albums變量中了,那么這里也應(yīng)當(dāng)很容易看得出我們是在遍歷所有Album節(jié)點(diǎn),然后把其子元素Title的值以li的形式輸出。再加上最外面包圍的一個(gè)ul,整個(gè)一個(gè)無序列表就出來了。

這里無需編譯,可以直接運(yùn)行Index.xml以查看結(jié)果,我們可以把這些內(nèi)容直接返還給客戶端。樣式表(xslt)文件因?yàn)槭庆o態(tài)的,所以客戶端只需要下載一次既可,可以暫時(shí)認(rèn)為和css文件類似,只是其功能側(cè)重點(diǎn)不同而已。

我想,看到這里,你一定會(huì)想到,如果做分布式的話,xslt確實(shí)可以給出不錯(cuò)的解決方案。

問題像是已經(jīng)都解決了。但由于返回的只是xml和xslt文檔,加上搜索引擎對(duì)xml和xslt支持并不怎么樣,還可能有一些瀏覽器根本不支持xslt的情況,那么就要用到服務(wù)器端的編譯了:

再建立一個(gè)Transform.ashx文件:

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
context.Response.ContentEncoding = Encoding.UTF8;

string xmlUrl = context.Server.MapPath(@"Index.xml");
string xsltUrl = context.Server.MapPath(@"Index.xslt");
XslCompiledTransform trans = new XslCompiledTransform();
trans.Load(xsltUrl, new XsltSettings() { EnableDocumentFunction = true, EnableScript = true }, new XmlUrlResolver());
trans.Transform(xmlUrl, null, context.Response.OutputStream);
}

還有一個(gè)問題就是怎么知道是蜘蛛訪問的還是用戶訪問的呢?目前我是使用的檢查UserAgent里面的值。之前在XSLT 入門--實(shí)際應(yīng)用中使用的是排除蜘蛛的方式,這里要使用排除已知支持XSLT的瀏覽器的方式:

在web.config中appSettings節(jié)點(diǎn)下加入如下值:

<add key="XsltSupportBrowsers" value="Chrome|MSIE 9.0"/>

然后將Transform.ashx中ProcessRequest方法更改如下:

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
context.Response.ContentEncoding = Encoding.UTF8;

string[] xsltSupportBrowsers = ConfigurationManager.AppSettings["XsltSupportBrowsers"].Split('|');
foreach (var xsltSupportBrowser in xsltSupportBrowsers)
{
if (context.Request.UserAgent.Contains(xsltSupportBrowser))
{
context.Response.ContentType = "text/xml";
context.Response.WriteFile(context.Server.MapPath("Index.xml"));
 return;
}
}

string xmlUrl = context.Server.MapPath(@"Index.xml");
string xsltUrl = context.Server.MapPath(@"Index.xslt");
XslCompiledTransform trans = new XslCompiledTransform();
trans.Load(xsltUrl, new XsltSettings() { EnableDocumentFunction = true, EnableScript = true }, new XmlUrlResolver());
trans.Transform(xmlUrl, null, context.Response.OutputStream);
}

Index.xml文件和Index.xslt文件的路徑是固定的,不會(huì)改變的,可以直接寫。

通過httpHandlers配置節(jié)點(diǎn)將請(qǐng)求映射到處理程序。

那么我們也可以把所有請(qǐng)求都交給一個(gè)Handler來處理,xslt和xml文件我們都放到同一個(gè)目錄的情況下可以這樣做:

在httpHandlers配置節(jié)點(diǎn)中加入一條配置,將所有對(duì).xhtml文件的請(qǐng)求都交給我們的Transform Handler來處理:

<add verb="*" path="*.xhtml" type="MusicStore.Web.Albums.Transform"/>

.ashx文檔(一般處理程序)可大大簡化xslt的實(shí)施。

然后將Transform.ashx中ProcessRequest方法也可以再次更改成通用的方式,在這里沒有做異常處理,因?yàn)閮H僅是為了說明能這樣做:

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
context.Response.ContentEncoding = Encoding.UTF8;
string requestPhysicalPath = context.Request.PhysicalPath;
string requestFileName = requestPhysicalPath.Substring(0, requestPhysicalPath.LastIndexOf("."));
string xmlUrl = requestFileName + ".xml";
string xsltUrl = requestFileName + ".xslt";
string[] xsltSupportBrowsers = ConfigurationManager.AppSettings["XsltSupportBrowsers"].Split('|');
foreach (var xsltSupportBrowser in xsltSupportBrowsers)
{
if (context.Request.UserAgent.Contains(xsltSupportBrowser))
{
context.Response.ContentType = "text/xml";
context.Response.WriteFile(xmlUrl);
return;
}
}
XslCompiledTransform trans = new XslCompiledTransform();
trans.Load(xsltUrl, new XsltSettings() { EnableDocumentFunction = true, EnableScript = true }, new XmlUrlResolver());
trans.Transform(xmlUrl, null, context.Response.OutputStream);
}

都搞定了,不過還有個(gè)問題還是現(xiàn)在說一下吧,那就是不是所有時(shí)候我們都愿意把所有的內(nèi)容都寫到一個(gè)xslt中。例如:網(wǎng)站的頁頭和頁腳難道每個(gè)XSLT文件中都復(fù)制粘貼一份?這里再建立一個(gè)Albums.xslt來解決這個(gè)問題:

可以通過指定xslt模板的name屬性來聲明一個(gè)可訪問的xslt模板。

<?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" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes"/>
<xsl:template name="Albums" match="album">
<xsl:variable name="AlbumServiceUrl" select="album"></xsl:variable>
<xsl:variable name="Albums" select="document($AlbumServiceUrl)/Albums/Album"></xsl:variable>
<ul>
<xsl:for-each select="$Albums">
<li>
<xsl:value-of select="Title"/>
</li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>

這里最主要的是使用了template的name屬性,也就是給模板起個(gè)名字。可以先認(rèn)為就像.net里的服務(wù)器控件,給它起個(gè)ID就可以訪問。但性質(zhì)是完全不同的。

call-template標(biāo)記通過name屬性指定模板名稱來調(diào)用xslt模板。

調(diào)用xslt模板的方式也有多種:

這里使用<xsl:call-template />標(biāo)記:

<xsl:call-template name="Albums" />

由于我們將此模板放到了Albums.xslt文件中,而不是在當(dāng)前文檔中,所以得使用另一個(gè)標(biāo)記來引入外部的xslt文件,

Import標(biāo)記通過href屬性指定xslt URL來引入外部XSLT文件。

將此標(biāo)記放到Index.xslt文檔的output標(biāo)記之前:

<xsl:import href="Albums.xslt"/>


此時(shí)再將Index.xslt中的變量聲明與ul下的所有內(nèi)容注釋或刪除。仍然可以得到想要的結(jié)果。

下載此項(xiàng)目源代碼


Logo
作者:Gezidan
出處:http://www.rixu.net    
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

本文轉(zhuǎn)載自 http://www.cnblogs.com/javennie/archive/2011/09/28/xsltinaspnet.html
posted on 2011-09-28 10:33 日需博客 閱讀(453) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C#技術(shù)文章轉(zhuǎn)載
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美在线综合视频| 欧美一级片久久久久久久 | 国产精品色网| 欧美日韩系列| 欧美日韩精品免费观看视一区二区 | 久久久之久亚州精品露出| 久久视频在线免费观看| 免费av成人在线| 欧美日韩在线另类| 国产精品一区在线播放| 国内精品久久久久伊人av| 精品动漫3d一区二区三区免费| 亚洲国产高清在线观看视频| 日韩图片一区| 欧美一区二区三区另类 | 国产中文一区| 亚洲精品一区二区在线观看| 亚洲一区二区综合| 久久婷婷蜜乳一本欲蜜臀| 欧美激情日韩| 亚洲一区二区三区高清不卡| 久久久www成人免费无遮挡大片| 欧美成人高清视频| 国产精品伦理| 亚洲精品中文字| 欧美伊人久久久久久午夜久久久久| 猫咪成人在线观看| 亚洲视频在线观看免费| 久久香蕉精品| 国产精品一二三四| 亚洲免费观看高清完整版在线观看熊 | 亚洲一区二区在| 欧美日韩国产精品一区| 国产欧美精品xxxx另类| 亚洲精品欧美日韩| 久久精品国产清自在天天线 | 最新国产成人在线观看| 日韩视频三区| 免费观看日韩av| 国产视频一区二区三区在线观看| 亚洲精品孕妇| 欧美a级片一区| 欧美一乱一性一交一视频| 欧美婷婷在线| 亚洲免费成人| 欧美激情中文字幕一区二区| 午夜国产精品视频| 欧美性猛交xxxx免费看久久久| 亚洲黄一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲午夜成aⅴ人片| 欧美日韩精品二区第二页| 亚洲国产精品一区在线观看不卡| 久久久久国产一区二区| 亚洲一区二区三区国产| 国产精品久久久久久五月尺| 亚洲一区二区三区视频播放| 亚洲精品乱码久久久久久蜜桃91 | 久久综合九色九九| 在线成人激情| 欧美ab在线视频| 美女主播精品视频一二三四| 一区二区视频免费在线观看 | 玖玖玖免费嫩草在线影院一区| 亚洲欧美日韩直播| 国产日韩在线视频| 久久免费观看视频| 久久久午夜视频| 91久久精品美女高潮| 亚洲国产日韩欧美综合久久| 欧美激情视频一区二区三区免费| 亚洲精品国产精品国自产观看浪潮 | 欧美一区在线看| 欧美呦呦网站| 亚洲第一精品夜夜躁人人爽 | 亚洲国内自拍| 欧美日韩成人| 午夜视频在线观看一区| 性伦欧美刺激片在线观看| 国内精品一区二区| 欧美激情网站在线观看| 欧美日韩一区二区三区高清| 欧美一区1区三区3区公司| 久久精品国产亚洲一区二区三区| 久久精品91久久久久久再现| 亚洲激情电影在线| 一区二区精品| 韩日视频一区| 亚洲欧洲精品一区二区精品久久久| 欧美女同在线视频| 久久高清福利视频| 欧美777四色影视在线| 亚洲一区二区在线看| 久久综合国产精品| 亚洲欧美日韩一区在线| 久久三级福利| 亚洲欧美视频一区| 美国成人毛片| 久久激五月天综合精品| 蜜桃av一区二区三区| 午夜在线精品偷拍| 欧美激情国产高清| 久久先锋影音av| 欧美日韩精品免费在线观看视频| 午夜精品福利在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲自拍三区| 欧美成人午夜激情| 欧美一区在线视频| 欧美日韩一区二区三区免费 | 亚洲电影第1页| 国产视频精品xxxx| 99在线热播精品免费| 亚洲国产经典视频| 亚洲欧美一区二区激情| 一区二区久久久久| 免费成人性网站| 久热精品视频在线| 国产欧美日韩视频一区二区三区 | 国产日韩欧美三级| 亚洲美女性视频| 亚洲人久久久| 久久视频在线免费观看| 亚洲午夜久久久| 蜜臀91精品一区二区三区| 欧美一区二区高清| 欧美区一区二| 欧美激情精品久久久久久黑人| 国产深夜精品福利| 99精品热视频只有精品10| 亚洲国产精品va在线看黑人动漫 | 欧美久久影院| 欧美韩日亚洲| 精品99一区二区| 欧美一区二区国产| 亚洲一区二区在线| 国产精品毛片a∨一区二区三区|国 | 久久综合99re88久久爱| 久久精品国产精品| 亚洲午夜av在线| 在线一区二区三区四区| 免费中文字幕日韩欧美| 免费看亚洲片| 亚洲毛片一区二区| 毛片一区二区三区| 欧美刺激性大交免费视频| 黄色一区二区三区| 久久成人18免费网站| 久久精品道一区二区三区| 国产精品日韩一区二区三区| 亚洲综合日韩在线| 亚洲一品av免费观看| 国产精品成人av性教育| 一区二区91| 性久久久久久| 国产在线乱码一区二区三区| 久久免费高清| 亚洲国产精品高清久久久| 亚洲精品视频在线| 欧美三级网址| 亚洲一区自拍| 欧美高清在线观看| 99精品视频免费观看视频| 欧美日韩一本到| 亚洲永久网站| 毛片一区二区| 亚洲图片欧美午夜| 国产精品影片在线观看| 久久精品国产亚洲a| 亚洲成人资源| 亚洲国产精品久久久久秋霞不卡 | 午夜视频在线观看一区二区三区| 国产日韩欧美一区| 免费不卡在线视频| 一区二区三区欧美在线观看| 欧美影院午夜播放| 亚洲国产精品悠悠久久琪琪| 欧美激情视频免费观看| 99国内精品久久| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲精品乱码久久久久久黑人 | 欧美一区久久| 亚洲精品1234| 欧美在线黄色| 亚洲视频在线观看三级| 国内成人自拍视频| 欧美日本簧片| 久久精品亚洲精品国产欧美kt∨| 欧美黄色影院| 久久久久国产精品一区三寸| 日韩一区二区福利| 国产人成精品一区二区三| 美女爽到呻吟久久久久| 中文在线资源观看网站视频免费不卡 | 亚洲综合色婷婷| 亚洲国产一区二区三区青草影视 | 亚洲成色777777女色窝| 国产精品久久中文| 欧美欧美全黄| 美女视频黄 久久|