zoukankan      html  css  js  c++  java
  • XSLT几种应用场景

    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);
            }
    

    关于如何编译xslt文件,请参考http://www.cnblogs.com/chenxizhang/archive/2009/05/24/1488492.html

    本文由作者:陈希章 于 2009/6/19 20:08:48 发布在:http://www.cnblogs.com/chenxizhang/
    本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
  • 相关阅读:
    一些用位运算解决的方法
    代码之美中的二分搜索算法Java版
    Connection listeners: accepting TCP connections 翻译
    Android网络编程1
    HelloWorldForU 九度Online Judge
    Ubuntu下设置默认java
    分享一个libevent server——cliserver
    编程原则
    hive迁移hadoop namenode时遇到的问题
    python for语句
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1507022.html
Copyright © 2011-2022 走看看