XSLT可以针对XML数据文件进行转换(Transfom),它的作用相当于就是样式表(css)之于HTML文件。

本文假设,我们有一个XML数据文件

<?xml version="1.0" encoding="utf-8" ?>
<Order xmlns:d="http://www.xizhang.com">
<d:OrderID>10248</d:OrderID>
<d:OrderDate>2009-1-1</d:OrderDate>
</Order>


同时,我们假设有一个编写好的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" xmlns:d="http://www.xizhang.com"
>
<xsl:output method="html"/>

<xsl:template match="/Order">
<html>
<body>
<table>
<tr>
<th>订单编号</th>
<th>订购日期</th>
</tr>
<tr>
<td>
<xsl:value-of select="d:OrderID"/>
</td>
<td>
<xsl:value-of select="d:OrderDate"/>
</td>
</tr>
</table>
</body>

</html>
</xsl:template>
</xsl:stylesheet>


我下面总结几种常见的使用场景

1. 第一种场景:直接在XML文件中定义样式表链接。这样这个XML文件就可以直接被XML解析器进行展现,例如在浏览器中

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="XSLTFile1.xslt"?>
<Order xmlns:d="http://www.xizhang.com">
<d:OrderID>10248</d:OrderID>
<d:OrderDate>2009-1-1</d:OrderDate>
</Order>
这种情况需要修改数据文件本身,所以有一些局限性。
2.  我们还可以在ASPX页面中通过xml控件来执行这个转换
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Xml DocumentSource="~/Data.xml" TransformSource="~/XSLTFile1.xslt" ID="xml1" runat="server" Visible="true"></asp:Xml>
</div>
</form>
</body>
</html>


这种做法,可以直接将转换得到的输出显示在页面上,而且无需编写任何代码。但因为只有两个属性设置,所以灵活性也相对有限

 

3. 我们还可以利用代码的方式对其进行转换。例如下面的代码,我们通过样式表,对XML文档进行转换,并将结果保存为另外一个文件

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Xml DocumentSource="~/Data.xml" TransformSource="~/XSLTFile1.xslt" ID="xml1" runat="server" Visible="true"></asp:Xml>
<br />
<asp:Button ID="btgenerateFile" runat="server" Text="产生文档" OnClick="GenerateFile" />
</div>
</form>
</body>
</html>


在代码文件中,添加如下代码

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Xml.Xsl;

namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void GenerateFile(object sender, EventArgs e)
{
string dataFile = Server.MapPath("Data.xml");
string styleFile = Server.MapPath("XSLTFile1.xslt");
string outputFile=Server.MapPath("output.html");

XslTransform tran = new XslTransform();
tran.Load(styleFile);
tran.Transform(dataFile, outputFile);
}
}
}


 

4. 我们还可以将转换的结果保存为内存中的字符串(也就是说不一定要保存为文件),作为后续操作的基础。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Xml DocumentSource="~/Data.xml" TransformSource="~/XSLTFile1.xslt" ID="xml1" runat="server" Visible="true"></asp:Xml>
<br />
<asp:Button ID="btgenerateFile" runat="server" Text="产生文档" OnClick="GenerateFile" />
<br />
<br />
<asp:Button ID="btgenerateString" runat="server" Text="产生字符串"
OnClick="GenerateString" />
</div>
</form>
</body>
</html>
代码文件
protected void GenerateString(object sender, EventArgs e)
{
//这个方法是直接将转换的结果保存为一个字符串

string dataFile = Server.MapPath("Data.xml");
string styleFile = Server.MapPath("XSLTFile1.xslt");

StringBuilder output = new StringBuilder();

XslTransform tran = new XslTransform();
tran.Load(styleFile);

XmlDocument doc = new XmlDocument();
doc.Load(dataFile);

tran.Transform(doc.CreateNavigator(), null, new StringWriter(output));

Response.Write(HttpUtility.HtmlEncode(output.ToString()));

}



5. 我们还可以使用新增的XslCompiledTransform进行更加好的转换。支持对xslt的编译

protected void GenerateFile(object sender, EventArgs e)
{
string dataFile = Server.MapPath("Data.xml");
string styleFile = Server.MapPath("XSLTFile1.xslt");
string outputFile=Server.MapPath("output.html");

//XslTransform tran = new XslTransform();
XslCompiledTransform tran = new XslCompiledTransform();
tran.Load(styleFile);
tran.Transform(dataFile, outputFile);
}


 


本文由作者:陈希章 ​

本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。