您的位置:首页 > Web前端 > HTML

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

2006-12-04 11:25 423 查看
XSL分这么几个部分:
XSLT – 这个用来把XML转换成别的格式比如说HTML
XPath – 这个是用来查询XML文档的
XSL(old XSL-FO) – 这个是用来定义XML文档在各种媒介(屏幕,打印etc.)输出的格式

XSLT

XSLT(XSL Transformations)是用来把XML文档转换成其他的XML文档或者(X) HTML文档的一种技术。最常用的就是把XML转化成HTML。
XSLT本身也是XML格式的,也就是他本身也是XML的一个应用。
XSLT要用到XPath。
XSLT使用xsl扩展名。
那么XSLT是怎么工作的呢?假如我们要把一个XML文档转换成HTML文档,XSLT预先用XPath规定了一些查询条件,当XML文档里的元素符合XPath时XSLT就把相应的元素转换成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的重要应用。这个前缀把XSLT和HTML区分开来。黄色标记的就是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 > 10">
这个不多说了,判断条件用的

<xsl:choose>
<xsl:when test="price > 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属性是eng的title节点
/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的简单参考
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息