zoukankan      html  css  js  c++  java
  • xslt转换xml

        关于xslt转换xml的文章,我发现有一篇总结比较好的,请参考http://www.cnblogs.com/RicCC/archive/2006/12/20/Xml-Xslt-Transform.html

    这里写的目的只是强调一些比较重点的地方。关于xslt转换xml,现在用的比较多的还是用.net类库来解决。我们看一下相应的命名空间及相关方法。实际上主要是XslCompiledTransform.Transform方法的调用。XslCompiledTransform.Transform重载的方法比较多,看一下先。

    针对这些方法,根据需求可以用不同的写法去解决,原文作者总结的很好。

    //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());

     //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());

    VS2005下面,也可以用另外的方法,即生成HTML的临时文件。注意,在调用transform.Transform()方法的时候,a.html文件并不存在,transform.Transform()方法会自动创建这个文件,将转换后的结果输出到这个文件中。

    //VS2005
    XslCompiledTransform transform = new XslCompiledTransform();
    transform.Load(Server.MapPath(
    "a.xslt"));
    transform.Transform(Server.MapPath(
    "a.xml"), Server.MapPath("a.html"));
    Response.WriteFile(Server.MapPath(
    "a.html"));

        另外值得注意的,上面使用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());

    还有一种用的比较少的。
    用MSXML COM对象解析。
            基于MSXML COM对象的方式,可以在所有的脚本语言、VB、.Net等使用,例如在客户端的JavaScript里面也可以创建MSXML COM对象,将xml转换成HTML。下面示例在.Net环境下使用这种方式。

    using MSXML2;
    using System.Xml;
    public partial class _Default : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        {
            MSXML2.DOMDocument xmldoc 
    = new DOMDocument();
            xmldoc.async 
    = false;
            xmldoc.load(Server.MapPath(
    "a.xml"));
            MSXML2.DOMDocument xsldoc 
    = new DOMDocument();
            xsldoc.async 
    = false;
            xsldoc.load(Server.MapPath(
    "a.xslt"));
            Response.Write(xmldoc.transformNode(xsldoc));
        }
    }

    强调一点的是:

         如果说你的xml文档是实时生成的,或直接从数据库里面读出来的。应该用到这里面的方法。

    XslCompiledTransform.Transform (IXPathNavigable, XsltArgumentList, Stream) 使用 IXPathNavigable 对象指定的输入文档执行转换,然后将结果输出到流。XsltArgumentList 提供附加的运行时参数。
    XslCompiledTransform.Transform (IXPathNavigable, XsltArgumentList, TextWriter) 使用 IXPathNavigable 对象指定的输入文档执行转换,然后将结果输出到 TextWriterXsltArgumentList 提供附加的运行时参数。
    XslCompiledTransform.Transform (IXPathNavigable, XsltArgumentList, XmlWriter) 使用 IXPathNavigable 对象指定的输入文档执行转换,然后将结果输出到 XmlWriterXsltArgumentList 提供附加的运行时参数。

    可以参考一下下面的代码:

    StringWriter output = new StringWriter();
    XslCompiledTransform transform 
    = new XslCompiledTransform();
    transform.Load(Server.MapPath(xsltPath));
    transform.Transform(JobDocument.CreateNavigator(), 
    null, output);
    Literal2.Text 
    = output.ToString();

    其中JobDocument是实时生成的,转换后然后输出到一个文本控件内。注意XmlDocument.CreateNavigator()方法。

  • 相关阅读:
    python 获取字典值
    EF 预热
    多线程实战(三)线程池
    多线程实战(二)线程同步
    C#并行编程 (Barrier,CountdownEvent,ManualResetEventSlim,SemaphoreSlim,SpinLock,SpinWait )
    多线程实战(一) 线程基础
    构建千万级web访问架构
    程序员创业,远离管理软件
    两棵树,你砍哪一棵?
    NopCommerce Html扩展方法Html.Widget
  • 原文地址:https://www.cnblogs.com/jackhuclan/p/1273839.html
Copyright © 2011-2022 走看看