天天看點

使用XML及XSL生成簡單HTML

某些時候需要生成HTML展現資料,考慮過XML加XSL方法嗎?比如,以html郵件的方式發送一些資料。

本文通過兩個已經存在的檔案,xml檔案和xsl檔案示範如何将其轉換成HTML。

首先,準備XML檔案,這裡為了示範,随便定義了一組資料。這些定義好的資料用于後面套入到對應的xsl模闆中。

<ROOT>

<ASPNETX Username="dudu" City="Shanghai" Cool="70" />

<ASPNETX Username="Bill" City="Meiguo" Cool="100" />

<ASPNETX Username="Gates" City="Meiguo" Cool="100" />

<ASPNETX Username="Aobama" City="Meiguo" Cool="80" />

<ASPNETX Username="aspnetx" City="Beijing" Cool="60" />

<ASPNETX Username="Geo" City="USA.East" Cool="20" />

<ASPNETX Username="Mike" City="USA.West" Cool="30" />

<ASPNETX Username="Jim" City="Jilin" Cool="90" />

<ASPNETX Username="Tim" City="Hebei" Cool="10" />

<ASPNETX Username="Ada" City="Big Apple" Cool="10" />

<ASPNETX Username="Jill" City="unknown" Cool="50" />

</ROOT>

XML資料檔案可以自己組織格式,因為在xsl模闆中是支援x-path查詢的。

然後,準備XSL檔案:

<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 match="/">

<table align="left" cellpadding="2" cellspacing="5">

<tr>

<td style="font-family: Verdana; font-size: 15px; font-weight: bold;">User in cnblogs:</td>

</tr>

<td style="font-family: Verdana; font-size: 10px;">

<table width="500px" align="left" cellpadding="2" cellspacing="0" style="font-family: Verdana; font-size: 10px;">

<td bgcolor="#808080">

<font color="#FFFFFF">

<b>User name</b>

</font>

</td>

<b>City</b>

<b>Cool</b>

<xsl:for-each select="ROOT/ASPNETX">

<td style="border: 1px solid #808080">

<xsl:value-of select="@Username"/>

<xsl:value-of select="@City"/>

<xsl:value-of select="@Cool"/>

</xsl:for-each>

</table>

</xsl:template>

</xsl:stylesheet>

在模闆檔案之中,xsl:template之間就是要展現的html模闆的内容。

xsl:value-of對應資料區域,select後跟x-path查詢。

Xsl:for-each枚舉得到的集合。

通過以上兩個标簽的占位,xml的資料就會根據其定義出現在對應的位置。

Xml和xsl都準備好,最後,準備c#代碼,下面的代碼将把模闆xsl和資料xml加載進來,然後把html内容輸出成一個string字元串:

static void TestXls()

{

//資料檔案

XmlReader _xmlxml = XmlReader.Create("xmldata.xml");

//模闆檔案

XmlReader _xmlxsl = XmlReader.Create("xsldata.xml");

//執行個體化轉換對象

XslCompiledTransform xslct = new XslCompiledTransform();

xslct.Load(_xmlxsl);

MemoryStream ms = new MemoryStream();

XmlTextWriter xmltxtWr = new XmlTextWriter(ms, null);

//開始轉換,并且将結果儲存到writer中。

xslct.Transform(_xmlxml, xmltxtWr);

//讀取結果

StreamReader st = new StreamReader(ms);

ms.Seek(0, SeekOrigin.Begin);

string TransformedHTML = st.ReadToEnd();

Console.WriteLine(TransformedHTML);

}

在.net下提供了現成的轉換對象,XslCompiledTransform。通過Load方法加載xsl檔案後,就可以調用Transform方法對xml進行轉換了。

Xmldata.xml和xsldata.xml檔案如果在項目中,記得設定其copy to output directory。預設這兩個檔案是不輸出到bin目錄的,是以如果不設定會導緻程式無法加載到相應的xml和xsl檔案。

使用XML及XSL生成簡單HTML

實際操作的時候,需要自己先組織好html部分的内容,盡量不要用網頁設計工具,因為這樣會生成很多的垃圾标簽,是以最好自己手寫。然後在适當的位置加上<xsl:xxx />标簽,最後放到xsl檔案中。

做好xsl模闆後,建議先自己調試一下看看能否搭配xml正常的輸出資料,偶爾有一些不符合規範的地方程式會報錯。

Xml的資料最常用的來源就是sql語句加for xml auto了,此時需要注意模闆裡的x-path查詢也要根據xml結果做相應的變化。

使用XML及XSL生成簡單HTML

由于visual studio在調試的時候,檢視字元串變量支援文本模式和html模式,是以在實際開發的時候調試起來會友善的很多。

使用XML及XSL生成簡單HTML
使用XML及XSL生成簡單HTML
使用XML及XSL生成簡單HTML

需要注意:

模闆中不能出現&這樣的字元,是以 這樣的要處理掉。

XML做x-path查詢是區分大小寫的,比如Root和root是無法比對上的。