XSLT转换XML小结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
using System.Xml; using System.Xml.Xsl;
using System.Xml.XPath; using System.Text; using System.IO; public partial class _Default : System.Web.UI.Page {
using System.Text; using System.IO; public partial class download : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
string fileName = "aaa_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; string fullPath = Server.MapPath(fileName); XmlTextWriter writer = new XmlTextWriter(fullPath, Encoding.UTF8); XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(Server.MapPath("a.xslt")); transform.Transform(Server.MapPath("a.xml"), null, writer); writer.Close(); Response.Clear(); Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName); Response.WriteFile(fullPath); } } 这种方式下载,是利用了 Excel 可以打开 html 网页(其实将文件后缀名改成.doc 也就可以 用 word 打开),如果将文件存到本地,用文本编辑器打开,就可以看到,实际上下载下来的是 一个 html 的页面文件。 下载的方式很多,这种方式有它的优点和缺点。优点是如果用 xslt 解析的网页,这种下载 方式实现上很方便;缺点,如果下载的数据比较多文件比较大(超过 1M 左右之后),用 Excel、 Word 打开时会很慢。如果对下载的 Excel 没有什么特殊的格式要求,只需要下载一条一条记录 集到 Excel 就可以,可以用 xslt 将 xml 转换成 CVS 格式的输出文本串,然后保存成 cvs 文件, 这样用 Excel 打开速度会很快。
Response.Write(xmldoc.transformNode(xsldoc));
}
}
2. 用.Net 的 xml 命名空间的类来转换 using System.Xml; using System.Xml.Xsl; using System.Xml.XPath; using System.Text; using System.IO; public partial class _Default : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
//VS2005,也可以象 VS2003 下面通过 XmlDocument 获取 XPathNavigator 对象的方式 //VS2005 与 2003 不同之处在于 2003 下的 XslTransform 被 XslCompiledTransform 代替, 这是 2005 下优化 xsl 性能的产物 StringWriter output = new StringWriter(); XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(Server.MapPath("a.xslt")); transform.Transform(Server.MapPath("a.xml"), null, output); Response.Write(output.ToString()); } }
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
MSXML2.DOMDocument xmldoc = new DOMDocument();
另外值得注意的,上面使用 StringWrite 作为 Transform 方法的输出,输出结果的 Encoding 为 UTF16,如果你一定要使输出结果的 Encoding 为 UTF8,请使用下面的方式。这估计是 StringWrite 从 Transform()方法接收到结果之后再转换成 UTF16,或者是.Net 实现 Transform()方 法时用 StringWriter 的 Encoding 属性覆盖了 xsl:output 节点的设置。 //VS2005 XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(Server.MapPath("a.xslt")); MemoryStream stream = new MemoryStream(); transform.Transform(Server.MapPath("a.xml"), null, stream); StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8); Response.WriteFile(reader.ReadToEnd());
VS2005 下面,也可以用另外的方法,即生成 HTML 的临时文件。注意,在调用 transform.Transform()方法的时候,a.html 文件并不存在,transform.Transform()方法会自动创建 这个文件,将转换后的结果输出到这个文件中。
//VS2005 XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(.MapPath("a.xslt")); transform.Transform(Server.MapPath("a.xml"), Server.MapPath("a.html")); Response.WriteFile(Server.MapPath("a.html"));
将包含<?xml version="1.0" encoding="utf-16"?>这样一行,因为默认 method 值为 xml。如果你的 XSLT 是想输出 HTML,而没有指定 xsl:output,则输出的 HTML 第一行将是这个 XML 的声明。 详细的 xsl:output,请参考:generate the html DOCTYPE element using xsl:output。
protected void Page_Load(object sender, EventArgs e) {
//VS2003 XmlDocument doc = new XmlDocument(); doc.Load(Server.MapPath("a.xml")); XPathNavigator navgator = doc.CreateNavigator(); StringWriter output = new StringWriter(); XslTransform transform = new XslTransform(); transform.Load(Server.MapPath("a.xslt")); transform.Transform(navgator, null, output); Response.Write(output.ToString()); } }
</tr> <xsl:for-each select="//ric/catalog/book">
<tr> <td> <xsl:value-of select="name"></xsl:value-of> </td> <td> <xsl:value-of select="author"></xsl:value-of> </td> <td> <xsl:value-of select="@price"/> </td>
转换后的 HTML 视图
Book Name Author Price
Inside SQL Server 2000 Kalen Delaney 75 The Guru's Guide to SQL Server Architecture
Ken Henderson 200
1. 用 MSXML COM 对
</catalog> </ric>
XSLT file: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0"
xmlns:xsl="/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8"/> <xsl:template match="/">
</tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 注意 xsl:output,指定转换后输出结果的格式,可以是 xml、html、text,如果不指定,默认 值为 xml。在下面的转换示例 2 的代码中,如果不指定这一句,你可以看到转换结果的一开始
xmldoc.async = false;
xmldoc.load(Server.MapPath("a.xml"));
MSXML2.DOMDocument xsldoc = new DOMDocument();
xsldoc.async = false;
xsldoc.load(Server.MapPath("a.xslt"));
<html> <body>
<table cellpadding="0" cellspacing="0" border="1" style="border-collapse:collapse;font-size:14px;">
<tr> <th>Book Name</th> <th>Author</th> <th>Price</方式,可以在所有的脚本语言、VB、.Net 等使用,例如在 客户端的 JavaScript 里面也可以创建 MSXML COM 对象,将 xml 转换成 HTML。下面示例在.Net 环境下使用这种方式。
using MSXML2;
using System.Xml;
VS2005(Framework 2.0)下面正确的写法,参考:generate the html DOCTYPE element using xsl:output。
3. 下载。用 xslt 转换 xml 生成网页,下载的处理是很方便的。 default.aspx 如下,只是个简单的示例,服务器端没有任何代码。 <input type="button" value="Download" onclick="window.open('download.aspx','download');" /> <iframe id="download" name="download" src="" style="display:none;"></iframe> download.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="download.aspx.cs" Inherits="download" %> download.aspx.cs: using System.Xml; using System.Xml.Xsl; using System.Xml.XPath;
XSLT 转换 XML 小结 产品几年前使用 ASP,后来升级到.Net 1.1,再升级到 2.0,一直都有用 XSLT 转换 XML 生
成网页的方式,稍微整理下。
XML file: <?xml version="1.0" encoding="utf-8" ?> <ric>
<catalog> <book price="75"> <author>Kalen Delaney</author> <name>Inside SQL Server 2000</name> </book> <book price="200"> <author>Ken Henderson</author> <name>The Guru's Guide to SQL Server Architecture</name> </book>