精华内容
下载资源
问答
  • Xslt

    2020-12-26 06:14:22
    <div><p>Addition of xml stylesheet transformation functions (relies on the libxml 2.9.1 branch and the thirdparty xslt branch for the xslt library). Functions supplied here are: <p>xsltApplyStylesheet...
  • XSLT

    2019-09-24 22:50:39
    XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言; XPath 是一种用于在 XML 文档中进行导航的语言; 本文目录 1、XSLT的主要功能 2、XSLT是如何工作的 3、正确的样式表声明 4、创建XSLT样式...

    XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言;

    XPath 是一种用于在 XML 文档中进行导航的语言;

    本文目录

    1、XSLT的主要功能

    2、XSLT是如何工作的

    3、正确的样式表声明

    4、创建XSLT样式表

    5、template的使用

    6、valueof元素的使用

    7、foreach的使用

    8、sort的使用

    9、if的使用

    10、choosewhen的使用

    11、applytemplate的使用

    12、variable的使用

    13、param的使用

    14、script的使用

    XSLT的主要功能:

    1、它将一个没有形式表现的XML内容文档作为一个源树,将其转换为一个有样式信息的结果树;

    2、在XSLT文档中定义了与XML文档中各个逻辑成分相匹配的模板,以及匹配转换方式。这样可以将转换为另一个逻辑结构的XML文档、HTML文档、XHTML文档、VRML文档、SVG文档等等。 

    XSLT是如何进行工作的?

    XSLT 使用 XPath 来定义源文档中可匹配一个或多个预定义模板的部分。一旦匹配被找到,XSLT 就会把源文档的匹配部分转换为结果文档。

    转换模式:一般分服务器端和客户端转换两种;

     

    服务器端转换简单实例:

    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.Xml;
    using System.Xml.XPath;
    using System.Xml.Xsl;
    
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string xmlpath = Server.MapPath("books.xml");
            string xsltpath = Server.MapPath("XSLTFile2.xslt");
            XPathDocument xpd = new XPathDocument(xmlpath);
            XslCompiledTransform xslcom = new XslCompiledTransform();
            xslcom.Load(xsltpath);
            xslcom.Transform(xpd,null, Response.Output);
        }
    }
    客户端转换实例:
    <!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>
        <title>无标题页</title>
         <script for="window" event="onload" type="text/javascript">
    
                divResults.innerHTML = mybook.transformNode(stylesheet);
    
        </script>
    </head>
    <body>
    
      <xml  src="books.xml" id="mybook"></xml>
        <xml src="XSLTFile2.xslt"  id="stylesheet"></xml>
          <div id="divResults"></div>
       
    </body>
    </html>

    正确的样式表声明

    把文档声明为 XSL 样式表的根元素是 <xsl:stylesheet> 或 <xsl:transform>。

    注释: <xsl:stylesheet> 和 <xsl:transform> 是完全同义的,均可被使用!

    根据 W3C 的 XSLT 标准,声明 XSL 样式表的正确方法是:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    或者:

    <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    如需访问 XSLT 的元素、属性以及特性,我们必须在文档顶端声明 XSLT 命名空间。

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 指向了官方的 W3C XSLT 命名空间。如果您使用此命名空间,就必须包含属性 version="1.0"。

    接下来从一个简单的XML文档开始(books.xml),

     

    <?xml version="1.0" encoding="utf-8" ?>
    <bookstore>
      <book category="COOKING">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
      </book>
      <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
      </book>
      <book category="WEB">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
      </book>
    </bookstore>
    

    创建XSLT样式表:  

    然后创建一个带有转换模板的 XSL 样式表(booksXSLT.xlst):

     

    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
              </tr>
              <xsl:for-each  select ="//book">
                <tr>
                <td>
                  <xsl:value-of  select ="title"/>
                </td>
                <td>
                  <xsl:value-of  select ="author"/>
                </td>
              </tr>
                
              </xsl:for-each>
              
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    

    向文档books.xml中添加xslt样式表引用:

     

     

    <?xml version="1.0" encoding="utf-8" ?>
    <?xml-stylesheet type="text/xsl" href="bookstoreXSLT.xslt"?>
    <bookstore>
      <book category="COOKING">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
      </book>
      <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
      </book>
      <book category="WEB">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
      </book>
    </bookstore>
    

    如果您使用的浏览器兼容 XSLT,它会很顺利地把您的 XML 转换为 XHTML;XSL 样式表由一个或多套被称为模板(template)的规则组成。每个模板含有当某个指定的节点被匹配时所应用的规则。

    <xsl:template> 元素

    <xsl:template> 元素用于构建模板。match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式;

    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
              </tr>
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    
    由于 XSL 样式表本身也是一个 XML 文档,因此它总是由 XML 声明起始:
    <?xml version="1.0" encoding="utf-8"?>

    下一个元素,<xsl:stylesheet>,定义此文档是一个 XSLT 样式表文档(连同版本号和 XSLT 命名空间属性)。<xsl:template> 元素定义了一个模板。match="/" 属性则把此模板与 XML 源文档的根相联系。<xsl:template> 元素内部的内容定义了写到输出结果的 HTML 代码。最后两行定义了模板的结尾,及样式表的结尾。

    上例的缺点是没能够把XML中的数据复制并输出,下面的事例使用使用 <xsl:value-of> 元素从 XML 元素选取值;

    <xsl:value-of> 元素

    <xsl:value-of> 元素用于提取某个选定节点的值,并把值添加到转换的输出流中:
    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
              </tr>
              
                <tr>
                <td>
                  <xsl:value-of  select ="/bookstore/book//title"/>
                </td>
                <td>
                  <xsl:value-of  select ="/bookstore/book/author"/>
                </td>
              </tr>
                
          
              
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    
    select 属性的值是一个 XPath 表达式。此表达式的工作方式类似于定位某个文件系统,在其中正斜杠(/)可选择子目录,上例的缺点是仅有一条数据输出;下面的例子使用 <xsl:for-each> 元素来循环遍历 XML 元素,并显示所有的记录

    <xsl:for-each>元素

    <xsl:for-each> 元素可用于选取指定的节点集中的每个 XML 元素。
    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
              </tr>
              <xsl:for-each  select ="/bookstore/book">
                <tr>
                <td>
                  <xsl:value-of  select ="title"/>
                </td>
                <td>
                  <xsl:value-of  select ="author"/>
                </td>
              </tr>
                </xsl:for-each>
              
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    
    select 属性的值是一个 XPath 表达式。此表达式的工作方式类似于定位某个文件系统,在其中正斜杠可选择子目录。

    <xsl:sort>元素

    对结果进行排序,在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素;
    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
              </tr>
              <xsl:for-each  select ="/bookstore/book">
                <xsl:sort order ="descending"  select="title"/>
                <tr>
                <td>
                  <xsl:value-of  select ="title"/>
                </td>
                <td>
                  <xsl:value-of  select ="author"/>
                </td>
              </tr>
                </xsl:for-each>
              
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    
    select 属性指示需要排序的 XML 元素;

    <xsl:if> 元素

    <xsl:if> 元素用于放置针对 XML 文件内容的条件测试,如需添加有条件的测试,请在 XSL 文件中的 <xsl:for-each> 元素内部添加 <xsl:if> 元素:
    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
                <td>Price</td>
              </tr>
              <xsl:for-each  select ="/bookstore/book">
                <xsl:if  test ="price>30">
                <tr>
                <td>
                  <xsl:value-of  select ="title"/>
                </td>
                <td>
                  <xsl:value-of  select ="author"/>
                </td>
                  <td>
                    <xsl:value-of select ="price"/>
                  </td>
              </tr>
                </xsl:if>
                </xsl:for-each>
              
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    
    必选的 test 属性的值包含了需要求值的表达式。

    <xsl:choose>元素

    <xsl:choose>结合<xsl:when>和<xsl:otherwise>来表达多重条件的测试:要插入针对 XML 文件的多重条件测试,请向 XSL 文件添加 <xsl:choose>、<xsl:when> 以及 <xsl:otherwise>:
    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
                <td>Price</td>
              </tr>
              <xsl:for-each  select ="/bookstore/book">
             
                <tr>
                  
                <td>
                  <xsl:value-of  select ="title"/>
                </td>
                <td>
                  <xsl:value-of  select ="author"/>
                </td>
                  <xsl:choose  >
                    <xsl:when  test ="price=30">
                      <td bgcolor="red">
                    <xsl:value-of select ="price"/>
                     </td>
                    </xsl:when>
                    <xsl:when test ="price < 30">                  
                      <td bgcolor="silver">
                        <xsl:value-of select ="price"/>
                      </td>
                    </xsl:when>
                    <xsl:otherwise >
                      <td >
                        <xsl:value-of select ="price"/>
                      </td>
                    </xsl:otherwise>
                  </xsl:choose>
                  
              </tr>
               
                </xsl:for-each>
              
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    
    必选的 test 属性的值包含了需要求值的表达式;

     <xsl:apply-templates> 元素

    <xsl:apply-templates> 元素可把一个模板应用于当前的元素或者当前元素的子节点。假如我们向 <xsl:apply-templates> 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序。请看下面的 XSL 样式表:

    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
                <td>Price</td>
              </tr>       
                 <xsl:apply-templates  ></xsl:apply-templates> <!--省略select属性表示选取当前节点的所有子节点-->            
            </table>
          </body>
        </html>
       
      </xsl:template>
      <xsl:template  match ="bookstore/book">
        <tr>
        <td>
          <xsl:apply-templates  select ="title"></xsl:apply-templates>
        </td>
        <td>
          <xsl:apply-templates  select ="author"/>
        </td>
        <td>
    
          <xsl:apply-templates  select ="price"></xsl:apply-templates>
        </td>
        </tr>
      </xsl:template>
      <xsl:template  match ="title">
        <xsl:value-of  select ="."/><!--.代表当前节点-->
      </xsl:template>
      <xsl:template  match ="author">
        <xsl:value-of  select ="."/>
      </xsl:template>
      <xsl:template  match ="price">
        <xsl:value-of  select ="."/>
      </xsl:template>
    </xsl:stylesheet>
    
     <xsl:apply-templates  >省略select属性表示选取当前节点的所有子节点;
    <xsl:value-of  select ="."/>:.代表当前节点。

    <xsl:variable>元素

    在参数或者变量声明以后,使用的时候,直接$参数名或变量名即可;参数值或者变量值可以直接赋值或者从XML文档获取;
      <xsl:param  name ="discount"  select ="0.50"></xsl:param>
     <xsl:variable name="price" select="user:price"></xsl:variable>
    <xsl:variable>事例:
    <?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"
    >
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
                <td>Price</td>
              </tr>
             
                <xsl:for-each  select ="bookstore/book">
                  <xsl:variable  name ="x" select ="price"/> 
                  <tr>
                <td>
                  <xsl:value-of  select ="title"/>
                
                </td>
                <td>
                  <xsl:value-of  select ="author"/>
                </td>
                <td>
                  <xsl:value-of  select ="$x"/>
                </td>
                  </tr>  
                </xsl:for-each>
                
            </table>
          </body>
        </html>
       
      </xsl:template>
     
    </xsl:stylesheet>
    
    变量x在每次循环的时候获取price的值,然后通过$x调用;

    <xsl:param>元素

    <xsl:param>元素使用实例:通过参数过滤数据
    <?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"
    >
      <xsl:param  name ="line" ></xsl:param>
      <xsl:template match ="/">
        <html>
          <head></head>
          <body>
            <h2>BookStore</h2>
            <table border="1">
              <tr>
                <td>Title</td>
                <td>Author</td>
                <td>Price</td>
              </tr>
             
                <xsl:for-each  select ="bookstore/book">
                  <xsl:if  test ="price > $line">
                 
                  <tr>
                <td>
                  <xsl:value-of  select ="title"/>
                
                </td>
                <td>
                  <xsl:value-of  select ="author"/>
                </td>
                <td>
                  <xsl:value-of  select ="price"/>
                </td>
                  </tr>  
                  </xsl:if>
                </xsl:for-each>
                
            </table>
          </body>
        </html>
       
      </xsl:template>
     
    </xsl:stylesheet>
    
    <xsl:param  name ="line" ></xsl:param>在文档中没有赋值,他的值来自于客户端;参数也是通过$参数名的方式调用;
    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml;
    using System.Xml.XPath;
    using System.Xml.Xsl;
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
           
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            XmlDocument xd = new XmlDocument();
            XsltArgumentList args = new XsltArgumentList();
            args.AddParam("line","",text1.Text);
            xd.Load(Server.MapPath("bookstore.xml"));
            XslCompiledTransform  xslcom=new XslCompiledTransform ();
            xslcom.Load(Server.MapPath("bookstoreXSLT.xslt"));
            xslcom.Transform(xd,args, Response.Output);
        }
    }

    XSLT With SCript

    带有脚本的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:user="dd"
    >
      <msxsl:script language ="C#"  implements-prefix ="user">
        <![CDATA[
          public string ReturnDiscount(string price)
          {
            decimal priceValue=Convert.ToDecimal(price);
            return (priceValue- priceValue * 15 / 100).ToString();
          }
        ]]>
      </msxsl:script>
       
    
        <xsl:template match="/">
          <html>
            <head></head>
            <body>
              <h2>BookStore</h2>
              <table border="1">
                <tr>
                  <td>Title</td>
                  <td>Author</td>
                  <td>Price</td>
                  <td>折后价</td>
                </tr>
    
                <xsl:for-each  select ="user:books/user:book">
                 
    
                    <tr>
                      <td>
                        <xsl:value-of  select ="user:title"/>
    
                      </td>
                      <td>
                        <xsl:value-of  select ="user:author"/>
                      </td>
                      <td>
                        <xsl:value-of  select ="user:price"/>
                      </td>
                      <td>
                        <xsl:value-of  select ="user:ReturnDiscount(user:price)"/>
                      </td>
                    </tr>
           
                </xsl:for-each>
    
              </table>
            </body>
          </html>
        </xsl:template>
    </xsl:stylesheet>
    

    implements-prefix 属性是必选项。 此属性用于声明命名空间并将其与脚本块关联;

     

     

     XmlDocument xd = new XmlDocument();
            XsltArgumentList args = new XsltArgumentList();
         
            xd.Load(Server.MapPath("books.xml"));
            XsltSettings xs = new XsltSettings(false, true);
            XslCompiledTransform  xslcom=new XslCompiledTransform ();
            xslcom.Load(Server.MapPath("bookscript.xslt"),xs,null);
            xslcom.Transform(xd,null, Response.Output);
    

     

    XsltSettings xs = new XsltSettings(false, true);设置xslt中EnableScript为true;

     

    小结:在变成过程中经常碰到的类:

     XsltArgumentList、 XPathDocument、XsltSettings、XslCompiledTransform

    常用方法:Load、Transform;

    转载于:https://www.cnblogs.com/LittleFeiHu/archive/2010/12/08/1893273.html

    展开全文
  • xslt

    2018-10-12 16:30:22
    xpath语法可以在 ... xslt转换在java中测试的方法 // copy from https://github.com/lib4j/lib4j-xml/blob/master/transform/src/main/java/org/lib4j/xml/transform/Trans...

    xpath语法可以在 http://www.w3school.com.cn/xpath/xpath_examples.asp 上在线测试

    xslt在浏览器中测试的方法,适合于html转换测试
    在xml的顶部加上

    <?xml version="1.0" encoding="utf-8" ?>
    <?xml-stylesheet type="text/xsl" href="XSLTFile1.xslt"?>
    

    xslt转换在java中测试的方法

    // copy from https://github.com/lib4j/lib4j-xml/blob/master/transform/src/main/java/org/lib4j/xml/transform/Transformer.java
    package com;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URISyntaxException;
    import java.net.URL;
    
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.TransformerFactoryConfigurationError;
    import javax.xml.transform.stream.StreamResult;
    import javax.xml.transform.stream.StreamSource;
    
    public final class Transformer {
        private static TransformerFactory factory;
    
        static {
            try {
                factory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
            }
            catch (final TransformerFactoryConfigurationError e) {
                factory = TransformerFactory.newInstance();
            }
        }
    
        public static void transform(final URL stylesheet, final URL in, final File out) throws IOException, TransformerException {
            try (final InputStream input = in.openStream()) {
                final StreamSource streamSource = new StreamSource(stylesheet.openStream(), stylesheet.toURI().toASCIIString());
                final javax.xml.transform.Transformer transformer = factory.newTransformer(streamSource);
                transformer.transform(new StreamSource(input, in.toURI().toASCIIString()), new StreamResult(out));
            }
            catch (final URISyntaxException e) {
                throw new TransformerException(e);
            }
        }
    
        private Transformer() {
        }
    
        public static void main(String[] args) throws Exception{
            Transformer.transform(new File("E:\\pro\\git\\com-test\\src\\main\\resources\\stylesheet.xsl").toURL(),new File("E:\\pro\\git\\com-test\\pom.xml").toURL(), new File("E:\\tmp\\pom.xml"));
        }
    }
    

    利用xslt对pom.xml增加dependency
    注意pom.xml的命名空间是xmlns=“http://maven.apache.org/POM/4.0.0
    stylesheet和xml的命名空间是不同的,为了不生成空的命名空间xmlns=""需要在stylesheet中指定命名空间保持和xml一致
    方法一: 获取父节点做拷贝stylesheet.xsl

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="http://maven.apache.org/POM/4.0.0">
        <xsl:param name="common.version"/>
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"  />
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
       <xsl:template match="/*/*[local-name()='dependencies']">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
                <dependency>
                    <groupId>com.test</groupId>
                    <artifactId>test-common</artifactId>
                    <version><xsl:value-of select="common.version"/></version>
                    <scope>provided</scope>
                </dependency>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    

    方法二:取得最后一个兄弟节点插入数据

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:my="http://maven.apache.org/POM/4.0.0" exclude-result-prefixes="my">
    
        <xsl:param name="common.version"/>
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"  />
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
        <xsl:template match="/my:project/*[last()]">
            <xsl:copy-of select="." />
            <distributionManagement>
                <repository>
                    <id>my-releases</id>
                    <name>myRelease Repository </name>
                    <url>http://maven.mycompany.com/nexus/content/repositories/my_releases/</url>
                </repository>
                <snapshotRepository>
                    <id>my-snapshots</id>
                    <name>my Snapshot Repository </name>
                    <url>http://maven.mycompany.com/nexus/content/repositories/my_snapshots/</url>
                </snapshotRepository>
            </distributionManagement>
        </xsl:template>
        <xsl:template match="/*/*[local-name()='dependencies']/*[last()]">
            <xsl:copy-of select="." />
            <dependency>
                <groupId>com.test</groupId>
                <artifactId>test-common</artifactId>
                <version><xsl:value-of select="$common.version"/></version>
                <scope>provided</scope>
            </dependency>
        </xsl:template>
    </xsl:stylesheet>
    
    展开全文
  • XSLT

    2007-01-23 06:22:00
    1. 什么是XSLT 大家可能听说过XSL(eXtensible Stylesheet Language),XSL和我们这里说的XSLT从狭义上理解是一样的,而按照W3C的标准,XSLT的说法更严格些,因此我们在文章中统一使用XSLT的称法。XSLT的英文标准...
      1. 什么是XSLT 
      大家可能听说过XSL(eXtensible Stylesheet Language),XSL和我们这里说的XSLT从狭义上理解是一样的,而按照W3C的标准,XSLT的说法更严格些,因此我们在文章中统一使用XSLT的称法。XSLT的英文标准名称为eXtensible Stylesheet Language Transformation。根据W3C的规范说明书(http://www.w3.org/TR/xslt),最早设计XSLT的用意是帮助XML文档(document)转换为其它文档。但是随着发展,XSLT已不仅仅用于将XML转换为HTML或其它文本格式,更全面的定义应该是: XSLT是一种用来转换XML文档结构的语言。 
       
      2. 为什么要用XSLT 
      我们已经知道,XML是一种电脑程序间交换原始数据的简单而标准的方法。它的成功并不在于它容易被人们书写和阅读,更重要的是,它从根本上解决了应用系统间的信息交换。因为XML满足了两个基本的需求: 
      (1).将数据和表达形式分离。就象天气预报的信息可以显示在不同的设备上,电视,手机或者其它。 
      (2).在不同的应用之间传输数据。电子商务数据交换的与日俱增使得这种需求越来越紧迫。 
      为了使数据便于人们的阅读理解,我们需要将信息显示出来或者打印出来,例如将数据变成一个HTML文件,一个PDF文件,甚至是一段声音;同样,为了使数据适合不同的应用程序,我们必须有能够将一种数据格式转换为另一种数据格式,比如需求格式可能是一个文本文件,一个SQL语句,一个HTTP信息,一定顺序的数据调用等。而XSLT就是我们用来实现这种转换功能的语言。将XML转换为HTML,是目前XSLT最主要的功能。 

      3. XSLT的历史 
      想很多其他XML家族成员一样,XSLT是由W3C起草和制定的。它的主要发展历程如下: 
      .1995年由James Clark提议; 
      .1997年8月正式提案为XSL; 
      .1998年5月由Norman Walsh完成需求概要; 
      .1998年8月18日XSL草案发布; 
      .1999年11月16日正式发布XSL 1.0推荐版本。 
      目前,XSLT仍然在快速的发展中,XSLT1.1的草案已经可以在W3C网站(http://www.w3.org/TR/xslt11)上看到。 
       
      4. 什么是XPath 
      XPath是XSLT的重要组成部分,我们将在第四章讲解它的详细语法。那么XPath是什么呢?我们首先来了解一下XSL系列的"家族"关系。如下图: 
         
      XSL在转换XML文档时分为明显的两个过程,第一转换文档结构;其次将文档格式化输出。这两步可以分离开来并单独处理,因此XSL在发展过程中逐渐分裂为XSLT(结构转换)和XSL-FO(formatting objects)(格式化输出)两种分支语言,其中XSL-FO的作用就类似CSS在HTML中的作用。而我们这里重点讨论的是第一步的转换过程,也就是XSLT。 
      另外,在学习XML时我们已经知道XML是一个完整的树结构文档。在转换XML文档时可能需要处理其中的一部分(节点)数据,那么如何查找和定位XML文档中的信息呢,XPath就是一种专门用来在XML文档中查找信息的语言。XPath隶属XSLT,因此我们通常会将XSLT语法和XPath语法混在一起说。 
      用一种比较好理解的解释:如果将XML文档看作一个数据库,XPath就是SQL查询语言;如果将XML文档看成DOS目录结构,XPath就是cd,dir等目录操作命令的集合。
       
      5. XSLT和CSS的比较 
      CSS同样可以格式化XML文档,那么有了CSS为什么还需要XSLT呢?因为CSS虽然能够很好的控制输出的样式,比如色彩,字体,大小等,但是它有严重的局限性,就是: 
      (1) CSS不能重新排序文档中的元素; 
      (2) CSS不能判断和控制哪个元素被显示,哪个不被显示; 
      (3) CSS不能统计计算元素中的数据; 
      换句话说,CSS只适合用于输出比较固定的最终文档。CSS的优点是简洁,消耗系统资源少;而XSLT虽然功能强大,但因为要重新索引XML结构树,所以消耗内存比较多。 
      因此,我们常常将它们结合起来使用,比如在服务器端用XSLT处理文档,在客户端用CSS来控制显示。可以减少响应时间。 
       
      6. XSLT和IE5 
      在XSLT草案发布不久,微软就在IE4中提供了支持XSL功能的预览版本,到IE5.0发布时,正式全面支持XSLT,可是由于IE5发布的比XSLT1.0标准时间早,因此在IE5.0中支持的XSTL功能和XSLT 1.0略有不同。(呵呵~~XML推行的主要原因之一就是解决HTML过分依赖浏览器的问题,现在微软又想标新立异?)。好在微软的IE5.5中执行的标准已经和W3C的XSLT1.0基本相近。但令人头疼的是IE5.0已经发行了几百万套,您使用的XSLT很可能不能被客户的浏览器正确执行。目前XSLT 1.1仍在发展中,W3C及有关组织也在和微软协商争取获得统一。呵呵~~故事还远远没有结束噢。 
      注意:本文中提到的语法都是根据XSLT 1.0的标准来讲的,没有任何微软的"方言"。 
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,269
精华内容 3,307
关键字:

xslt