XSL相关技术介绍-XSLT, XPath, XSL

来源:互联网 发布:java贪吃蛇 编辑:程序博客网 时间:2024/05/15 23:50

XSL分这么几个部分:

XSLT – 这个用来把XML转换成别的格式比如说HTML

XPath – 这个是用来查询XML文档的

XSLold XSL-FO这个是用来定义XML文档在各种媒介(屏幕,打印etc.)输出的格式

XSLT

XSLTXSL Transformations)是用来把XML文档转换成其他的XML文档或者(X) HTML文档的一种技术。最常用的就是把XML转化成HTML

XSLT本身也是XML格式的,也就是他本身也是XML的一个应用。

XSLT要用到XPath

XSLT使用xsl扩展名。

那么XSLT是怎么工作的呢?假如我们要把一个XML文档转换成HTML文档,XSLT预先用XPath规定了一些查询条件,当XML文档里的元素符合XPathXSLT就把相应的元素转换成HTML格式,当然转换方式是很灵活的。还是举个例子来说:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

  <html>

  <body>

    <h2>My CD Collection</h2>

    <table border="1">

    <tr bgcolor="#9acd32">

      <th align="left">Title</th>

      <th align="left">Artist</th>

    </tr>

    <xsl:for-each select="catalog/cd">

    <tr>

      <td><xsl:value-of select="title"/></td>

      <td><xsl:value-of select="artist"/></td>

    </tr>

    </xsl:for-each>

    </table>

  </body>

  </html>

</xsl:template>

</xsl:stylesheet>

这是一个典型的XSLT文档。

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>

<catalog>

  <cd>

    <title>Empire Burlesque</title>

    <artist>Bob Dylan</artist>

    <country>USA</country>

    <company>Columbia</company>

    <price>10.90</price>

    <year>1985</year>

  </cd>

</catalog>

这是我们要转换的XML文档。红色部分指明了与其对应的XSLT文档。

大家可以从XSLT文档中看到xsl前缀,这个正是我们在XML Basic里提到的namespace的重要应用。这个前缀把XSLTHTML区分开来。黄色标记的就是XSLT

我们必须有一个根节点(因为本身是XML

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

这里定义了版本和xsl前缀的namespace

之后是<xsl:template match="/">这是一个模版,一个XSLT文档里可以有多个模版,其中的match属性指明了这个模版的作用域,它的值是一个XPath表达式,这里“/”代表整个XML文档也就是作用于整个文档。

<xsl:for-each select="catalog/cd">这句实现了一个循环,意思就是对于文档下面的catalog节点下面的cd节点(也就是/catalog/cd,由select属性指明)进行循环,有几个cd节点就循环几次。

<xsl:value-of select="title"/>这句在循环体里面,用来取/catalog/cd/title节点的值。这句相当于是有输出的,取出来的值就放在转换后的文档的相应位置。

这样我们转换后的HTML文档是这样的:

<html>

  <body>

    <h2>My CD Collection</h2>

    <table border="1">

    <tr bgcolor="#9acd32">

      <th align="left">Title</th>

      <th align="left">Artist</th>

    </tr>

    <tr>

      <td>Empire Burlesque</td>

      <td>Bob Dylan</td>

    </tr>

    </table>

  </body>

</html>

显示出来就是一个表格。值得一提的是,不是所有的浏览器都支持XSLT,不过常用的差不多都支持J

好,例子说到这里。

 

下面我们来具体说说XSLT里面常用的语句:

<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">

这两个都可以做为根节点。

 

<xsl:template match="/">

这个用来定义一个模版,一个文档里可以有多个模版。

 

<xsl:value-of select="catalog/cd/title"/>

这个用来取出xml文档里特定的值,使用XPath

 

<xsl:for-each select="catalog/cd">

这个是一种循环机制,select指定循环的范围。

 

<xsl:sort select="artist"/>

这个用来排序,可以写在for-each里面用来指定排序列。

 

<xsl:if test="price &gt; 10">

这个不多说了,判断条件用的

 

<xsl:choose>

          <xsl:when test="price &gt; 10">

            <td bgcolor="#ff00ff">

            <xsl:value-of select="artist"/></td>

          </xsl:when>

          <xsl:otherwise>

            <td><xsl:value-of select="artist"/></td>

          </xsl:otherwise>

</xsl:choose>

这个相当于一个switch语句J

 

<xsl:apply-templates>

这个挺重要的,用来对当前节点和其子节点应用模版(当然得有相应模版存在)。

<xsl:apply-templates select="title"/>

加上属性select以后就可以只对子节点(这里只对title)应用模版,可以嵌套使用。

 

这里只列出常用的,更多的请参照这里

 

XPath

XPath作为一种基础支持贯穿于XML的多种应用中。

他主要用来查找XML文档,遍历XML文档。

 

XPath其实就是类似我们平时使用的路径一样的表达式。比如我们用c:/windows/system来定位system目录,我们也同样可以用/catalog/cd/title来定位一个以catalog为根节点的文档里的cd节点下面的所有的title节点J说着可能有些麻烦但是想起来很自然。因为他们都是树状结构的。

XPath有好多的内建函数用来提供高级的支持。

 

在这里我们用举例子的方式来给大家解释一下XPath,给大家一个感性的认识,具体系统的介绍大家可以去看w3c的文档或者看看MSXMLSDK的文档。

举例之前向大家介绍一下XPath里面的基本术语:

节点:在XPath里有七种节点他们是element, attribute, text, namespace, processing-instruction, comment, and document (root) nodes

节点关系:Parent, Children, Siblings, Ancestors, Descendants

下面对一些例子进行详解:

 

一般情况:

Path Expression

Result

Bookstore

选择bookstore节点的所有子节点。如果单纯写一个节点名字就是选择其所有子节点。

/bookstore

选择根节点bookstore

Note: 如果一个表达式由反斜杠开始,那么意味着这是一个全径,完全路径。

bookstore/book

选择bookstore节点的所有book子节点。

//book

选择文档里面所有的book节点。

bookstore//book

选择bookstore下面的所有book节点(不一定是bookstore的子节点)

//@lang

选择文档里所有名字是lang的属性。

.

代表当前节点

..

代表当前节点的父节点

带有限制条件的查询:

Path Expression

Result

/bookstore/book[1]

选择第一个book节点

/bookstore/book[last()]

选择最后一个book节点

/bookstore/book[last()-1]

倒数第一个book节点

/bookstore/book[position()<3]

选择前两个

//title[@lang]

选择所有具有lang属性的title节点

//title[@lang='eng']

选择所有lang属性是engtitle节点

/bookstore/book[price>35.00]

选择所有具有price子节点的book节点并且price节点的值是35.00

/bookstore/book[price>35.00]/title

满足上一个例子的book节点下的title节点

 

通配符:

Path Expression

Result

/bookstore/*

所有bookstore的子节点

//*

选择文档里的所有节点

//title[@*]

选择所有有属性的title节点,无论是什么属性

 

Axes

Example

Result

child::book

当前节点的book子节点

attribute::lang

当前节点的lang属性

child::*

当前节点的所有子元素(element

attribute::*

当前节点的所有属性

child::text()

当前节点的所有text子节点

child::node()

当前节点的所有子节点(无论什么类型)

descendant::book

选择当前节点的所有book子孙节点

ancestor::book

当前节点的所有叫做book的祖先

ancestor-or-self::book

当前节点的所有book祖先,如果他自己是book也可以

child::*/child::price

当前节点的所有price孙子节点,这个比较乱,其实就是分两部分,一是child::*代表当前节点下所有的子元素(element),之后再所有的子元素里找他们的price子节点,这就相当于孙子节点了J

 

好了就解释道这里吧,我自己都有些晕忽忽的了哈哈。

XSL

XSL 就是当初的XSL-FO据说当初设计XSL的时候是把转换和样式放在一起设计的,后来转换(XSLT)和样式/格式(XSL/XSL-FO)就分开了。所以现在的XSL就是原来的XSL-FO

XSL也是XML格式的,给个例子:

<?xml version="1.0" encoding="ISO-8859-1"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

 

<fo:layout-master-set>

  <fo:simple-page-master master-name="A4">

    <!-- Page template goes here -->

  </fo:simple-page-master>

</fo:layout-master-set>

 

<fo:page-sequence master-reference="A4">

  <!-- Page content goes here -->

</fo:page-sequence>

</fo:root>

一般以.fo或者.fob为扩展名。

要显示此文档所表示的样式我们需要软件支持,IE好像不支持XSL输出。这里有一些软件可以用来分析XSL产生输出。

由于我对他了解不多,平时用的很少,所以我只能说说我的感想,我感觉这个东西可能在打印输出上用的比较多。这里有一个关于XSL简单参考 

原创粉丝点击