由於項目的需要,最近學習了XLST和xml向html的轉變。
XML文檔的終極目標就是做為一個資訊的基本類型來儲存資訊,載被轉化為不同的格式來用於各種應用。W3C提出了擴充樣式語言規範來實現上述的目的。XSLT(the eXtensible Stylesheet Language Transformation)既是用於XML文本的轉化和格式化的標準語言。現面用一個簡單的例子來說明XML檔案是如何格式化後轉化為和HTML的。
以下是XML檔案的一部分。描述了資料庫中的實體:
<?xml version="1.0" encoding="utf-8" ?
<Entities>
<Entity title="公司客戶" name="Company" module="Users">
<Item title="名稱" name="Name" type="text"/>
<Item title="編號" name="Number" type="text" property="get"/>
<Item title="經理" name="Manage" type="text"/>
<Item title="電話" name="Phone" type="text"/>
<Item title="連絡人" name="Linkman" type="text"/>
<Item title="地址" name="Address" type="text"/>
<Item title="傳真" name="Fax" type="text" require="false"/>
</Entity>
<Entity title="使用者" name="User" module="Users">
<Item title="電子郵箱" name="Email" type="text"/>
<Item title="密碼" name="Password" type="text"/>
<Item title="消費總額" name="TotalConsumption" type="int"/>
<Item title="真實姓名" name="Name" type="text" require="false"/>
<Item title="公司" name="Company" type="entity" entityName="Company" require="false"/>
</Entity>
<Entity title="使用者地址" name="UserAddress" module="Users">
<Item title="使用者" name="User" type="entity" entityName="User" />
<Item title="地址" name="Address" type="text" />
<Item title="電話" name="Phone" type="text"/>
<Item title="是否是預設" name="IsDefault" type="bool" />
</Entity>
</Entities>
我現在想做的就是將xml檔案轉化為表格的形式,是實體及屬效能過比較直觀的表現出來。下面是對應這個XML檔案的XLST:
<?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:template match="/">
<html>
<body>
<h2 align="center">
短途餐飲物流平台實體資料分析<br />
</h2>
<xsl:apply-templates select="Entities/Entity"/>//對Entity節點應用模板
</body>
</html>
</xsl:template>
//Entity節點所對應的模板
<xsl:template match="Entity ">
<b>
<font color="bisgue">
<xsl:value-of select="@title"/>(<xsl:value-of select="@name"/>)資料分析:
</font>
<br />
</b>
<table width="70%" bordercolor="black" border="1">
<tr align="center" style="background-color:White;">
<th width="20%" >資料名稱</th>
<th width="20%">代碼</th>
<th width="20%">類型</th>
<th width="20%">是否可以為空白</th>
<th>描述</th>
</tr>
<xsl:for-each select="Item">//對節點的批量處理,他與元素xsl:apply-templates是兩種不同的方法但輸出的結果是想通的。
<tr align="center">
<td>
<xsl:value-of select="@title"/>
</td>
<td>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:value-of select="@type"/>
</td>
<td>
<xsl:apply-templates select="@require"/>
<xsl:if test="not(@require)">//判斷是否存在某個節點,用函數not(欲判斷的節點)
否
</xsl:if>
</td>
<td>
<xsl:value-of select="(@description)"/>
<xsl:if test="not(@description)">
null
</xsl:if>
</td>
</tr>
</xsl:for-each>
</table>
<br />
</xsl:template>
<xsl:template match="@require">
是
</xsl:template>
</xsl:stylesheet>
以下是XML檔案在應用到xlst後輸出的格式
公司客戶(Company)資料分析:
| 資料名稱 |
代碼 |
類型 |
是否可以為空白 |
描述 |
| 名稱 |
Name |
text |
否 |
null |
| 編號 |
Number |
text |
否 |
null |
| 經理 |
Manage |
text |
否 |
null |
| 電話 |
Phone |
text |
否 |
null |
| 連絡人 |
Linkman |
text |
否 |
null |
| 地址 |
Address |
text |
否 |
null |
| 傳真 |
Fax |
text |
是 |
null |
使用者(User)資料分析:
| 資料名稱 |
代碼 |
類型 |
是否可以為空白 |
描述 |
| 電子郵箱 |
Email |
text |
否 |
null |
| 密碼 |
Password |
text |
否 |
null |
| 消費總額 |
TotalConsumption |
int |
否 |
null |
| 真實姓名 |
Name |
text |
是 |
null |
| 公司 |
Company |
entity |
是 |
null |
使用者地址(UserAddress)資料分析:
| 資料名稱 |
代碼 |
類型 |
是否可以為空白 |
描述 |
| 使用者 |
User |
entity |
否 |
null |
| 地址 |
Address |
text |
否 |
null |
| 電話 |
Phone |
text |
否 |
null |
| 是否是預設 |
IsDefault |
bool |
否 |
null |
下面代碼將XML檔案轉化為和HTML檔案:
/// <summary>
///將xml轉化為html
/// </summary>
/// <param name="XmlPath">xml檔案路徑</param>
/// <param name="XslFilePath">xslt檔案路徑</param>
/// <param name="htmlFilePath">聲稱的html檔案路徑</param>
public static void XmlTransToHtml(string xmlPath, string xslFilePath, string htmlFilePath)
{
//產生Html檔案路徑
string HtmlFilePath = htmlFilePath;
XPathDocument myXPathDoc = new XPathDocument(xmlPath);
XslCompiledTransform myXslTrans = new XslCompiledTransform();
//載入XSL檔案
myXslTrans.Load(xslFilePath);
XmlTextWriter myWriter = new XmlTextWriter(HtmlFilePath, System.Text.Encoding.Default);
myXslTrans.Transform(myXPathDoc, null, myWriter);
myWriter.Close();
}
在測試類別中調用這個方法,運行測試就會得到我們需要的html檔案。(編譯環境 vs.net 2008)。