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/
    本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
  • 相关阅读:
    494 Target Sum 目标和
    493 Reverse Pairs 翻转对
    492 Construct the Rectangle 构建矩形
    491 Increasing Subsequences 递增子序列
    488 Zuma Game 祖玛游戏
    486 Predict the Winner 预测赢家
    485 Max Consecutive Ones 最大连续1的个数
    483 Smallest Good Base
    Django Form组件
    Django Auth组件
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1507022.html
Copyright © 2011-2022 走看看