-- 作者:宇宙人
-- 发布时间:5/18/2004 4:57:00 PM
-- XSL学习笔记(一)[推荐]
XSL学习笔记(一) 有人说XSL是CSS的替换者,真的吗? 1、简介 XSL是一种描述样式单的语言,包括XSLT、XPath和XML格式对象三部分。 与HTML不同,XML没有预定义的标签,所以浏览器不知道如何显示XML文档,而XSL就是XML之外用以说明如何显示的。 2、XSLT XSLT是一种将XML文档转换为另一种格式XML文档的语言。XML利用XSLT将源XML树转换为结果XML树。 3、浏览器差异 与IE6一起MSXML解析器完全支持XSLT1.0和XPath1.0,NetScape6不完全支持XSL(NS7呢?) 4、XSL样式单 一个XSL文件也是XML文件,所以第一行也要声明XML: <?xml version="1.0" encoding="ISO-8859-1"?> 第二行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"> 当用上述命名空间时,必须有version="1.0"的说明。 看列例子:XML文件,XSL文件,XML+XSL. 5、<xsl:template>元素 XSL样式单是由模板组成,每个模板就是一组规则。 模板的match属性,用以将模板和XML中的元素关联起来。如match="/"则将此模板与XML的根关联起来了。 6、<xsl:value-of>元素 该元素用于取得选定XML节点的值。 对节点的选取,由其select属性完成,select的值是一个XPath表达式。XPath表达式非常象*nix系统的多级目录的写法。如例中的“breakfast_menu/food”等。 7、<xsl:for-each>元素 完成在XSL中的循环动作。其属性select同6中所述。 此元素可以完成简单的过滤,例如: <xsl:for-each select="catalog/cd[artist='Bob Dylan']"> 可用于寻找Bob Dylan的CD作品。XSL定义了四种比较运算符:=、!=、<、>,两个比较之间可以用and 或or 连接。 8、<xsl:sort>元素 用于对输出进行排序,只需要将其放入<xsl:for-each>以内,并用select指明比较的元素即可。 9、<xsl:if>元素 当指定条件满足时,<xsl:if>包含的模板将派上用场。条件的定义,由其test属性指明,其操作符同7。 一般说来,<xsl:if>常出现在<xsl:for-each>内部。 10、<xsl:choose>、<xsl:when>、<xsl:otherwise>元素 三者联合,实现多条件选择,类似C语言里的case语句。如例: <xsl:choose> <xsl:when test="price > 10"> ... some code ... </xsl:when> <xsl:otherwise> ... some code .... </xsl:otherwise> </xsl:choose> 10、<xsl:apply-templates>元素 对当前元素和其子元素使用某一模板规则,象C里的递规函数,暗含着循环的功能。其用select属性指明元素。相对应的模板,则需要用match来判断传来的是什么元素,从这一点看模板象是C++里的重载函数。 11、XSL在客户端 当我们用浏览器打开一个引用XSL的XML文件时,浏览器在显示前做了一个将XML转换为XHTML的隐蔽动作。 这个动作可以用Javascript在IE上显式的完成,前提是XML中不要含有对XSL的引用。代码如下: <script type="text/javascript"> var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cdcatalog.xml") var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cdcatalog.xsl") document.write(xml.transformNode(xsl)) </script> 12、XSL在服务器端 对于IIS而言,可以很方便地在服务器端实现XML的转换。如下: <% set xml = Server.CreateObject("Microsoft.XMLDOM") xml.async = false xml.load(Server.MapPath("cdcatalog.xml")) set xsl = Server.CreateObject("Microsoft.XMLDOM") xsl.async = false xsl.load(Server.MapPath("cdcatalog.xsl")) Response.Write(xml.transformNode(xsl)) %>
|