520 likes | 771 Views
Ajax 编程技术 第八章 XSLT 和 XPath. 8.1 概述. 近年来,浏览器的主要改进之一就是它添加了可扩展样式表语言转换 (Extensible Stylesheet Language Transformation, XESLT) 处理程序。而在这之前, XSLT 被用来将一个 XML 文档的指定部分转换成另一个 XML 文档。 XSLT 的主要优点: 使文档结构和 Web 页面中内容及表现方式的分离。
E N D
8.1 概述 近年来,浏览器的主要改进之一就是它添加了可扩展样式表语言转换(Extensible Stylesheet Language Transformation, XESLT)处理程序。而在这之前,XSLT被用来将一个XML文档的指定部分转换成另一个XML文档。 • XSLT的主要优点: • 使文档结构和Web页面中内容及表现方式的分离。 • 可以使用其他XML语言(例如XPath)对XML文档进行查询。我们不必每次否访问数据库进行查询。只要从服务器得到XML文档后,在客户端就可以决定使用其中哪些数据。 • 使用XPath从XML 文档中选择和查询数据比使用JavaScript的效率更高更简单。 • 还可以使用层叠样式表(CSS)添加样式,而样式表也可以使用这种方式来控制页面的显示方式。我们还可以使用XSLT把普通XML文档展示得精美绝伦。 8-2
8.1 概述 • XSLT的缺点 • 用XSLT做的事情差不多都可以用JavaScript和DOM实现; • XSLT不仅增加了返回给客户端的文件大小,而且其结构也使得习惯于HTML和CSS技术人不认同; • 浏览器存在兼容性问题,IE和Firefox使用或呈现XSLT主要元素的方式不同。 8-3
8.2 XSLT及其用途 • 什么是XSL XSL和XML文件一样也是源于SGML的「DSSSL」(Document Style Semantics and Specification Language),基本上XSL并不像CSS只是单纯的定义样式,它的功能更加强大,属于一种真正的Script语言,在功能上主要分为两个部分,如下所示: • 转换XML文件:将XML文件架构转换成另一个XML架构的文件,或非XML文件,例如:HTML文件,即XSLT。 • 格式化XML文件:格式化元素内容的样式,以便显示出XML文件,即XSL-FO。 8-4
8.2 XSLT及其用途 • XSLT是如何工作 XSLT内容本身也是一份XML文件,XSLT的工作是将来源XML元素转换成XSLT元素,XSLT并不是在显示XML元素内容,只是将XML元素转换成其它文件的格式,所以通常并不称它为样式,而是XSLT Script转换语言。 在作法上「XSLT处理器」(XSLT Process)将XML文件依照XSLT Script的程序代码产生转换的结果,这种程序代码和JavaScript或VBScript不同,它属于一种「模板驱动」(Template-driven)转的换Script。 8-5
8.2 XSLT及其用途 • XSLT处理器能够将XML文件的来源文件,经过XSLT的范本比对处理后,产生输出的HTML或XML文件,如下图所示: 8-6
Web服务器 XSLT处理器 XSLT XML XSLT处理器 HTML浏览程序 XSLT 显示文件内容 8.2 XSLT及其用途 • XSLT处理器架构 整个XSLT处理器的转换架构,如下图所示: 8-7
CSS与XSLT的差异 • 虽然CSS和XSLT都可以将XML元素的内容,在浏览程序显示所需的内容,其差异如下表所示: 8-8
8.3 什么是XPath • XPath是一种语言,但它并不属于SQL类的查询语言,它只是一种节点位置的语言,用来描述XML元素的位置,如同硬盘文件夹的文件路径,如下所示: C:\xml\Chap8\Ch8-3.xml 上述路径指出文件Ch8-3.xml的位置,XPath指令则是指出XML元素的位置,也就是树状结构节点的位置,使用类似数据夹路径一般的字符串,定义出XML元素节点的位置,目前XPath语言同时被XSL和XPointer所采用,作为XML元素位置的描述语言。 8-9
XPath资料模型 01: <?xml version="1.0" encoding=“gb2312"?> 02: <glossary> 03: <item> 04: <title version="EN">eXtensible Markup Language</title> 05: <definition>可扩充展标示语言 <title>XML</title> </definition> 06: </item> 07: <item> 08: <title version="EN">encoding</title> 09: <definition>字符集</definition> 10: </item> 11: <item> 12: <title version="EN">Uniform Resource Identifier</title> 13: <definition>统一资源标识符<title>URI</title></definition> 14: </item> 15: </glossary> 8-10
XPath资料模型 8-11
XPath资料模型 • XPath逻辑树状结构的节点种类,如下表所示: 8-12
XPath的位置路径 • XPath语言的主要目的就是描述节点相对其它节点的位置,也就是选择那些符合条件的节点,我们称为「位置路径」(Location Path),位置路径的运算子,如下表所示: 8-13
XPath的位置路径 • 所有元素的位置路径 • XML文件的所有元素,也就是XPath的根节点,如下所示: / • 上述位置路径为根节点下的所有XML元素。 8-14
XPath的位置路径 • 子元素的位置路径 对于指定的元素,我们可以使用「/」正确的指出是那一个title元素,如下所示: /glossary/item/title 上述位置路径和下面的路径属于不同的title元素,如下所示: /glossary/item/definition/title 如果需要指出上述两个title元素,此时就需要使用「//」运算子,如下所示: //title 上述指的是根节点下所有的title元素,XML文件只要有title元素都符合此位置路径。 8-15
XPath的位置路径 通配符「*」 • 通配符「*」代表所有的元素和属性,如下表所示: 8-16
XPath的位置路径 • 属性的位置路径 如果位置路径属于属性,此时就需要使用「@」符号,如下所示: /glossary/item/title/@version 上述位置路径是从根节点开始,一层一层向下找寻子元素title,找到后传回version属性的值。 8-17
XPath的位置路径 • 节点的索引条件 XML元素的可能拥有同名的多个子元素,对于同名的元素,我们可以使用「[」和「]」符号定义元素的索引条件,如下表所示: 8-18
XPath的位置路径 • 节点间的关系- 轴(Axis)1 轴是指节点的关系,可以指出节点搜寻的方向,用来在XML文件找寻所需的元素。 在XPath的位置路径使用轴,可以配合使用前面的索引条件,如下所示: axis::node[predicate] 上述路径的轴之后是使用「::」符号连接索引条件。 8-19
XPath的位置路径 • 节点间的关系- 轴(Axis)2 8-20
XPath的位置路径 • 节点间的关系- 轴(Axis)3 一些位置路径的范例 ,如下表所示: 8-21
XPath的位置路径 • 节点间的关系- 轴(Axis)4 轴位置路径相当于一些位置路径的运算子,如下表所示: 8-22
XPath的位置路径 • 节点的组合条件 如果位置路径的条件不只一个,此时我们可以组合各条件以选择所需的元素,请使用「|」符号组合各条件,如下表所示: 8-23
XPath的函数 • 在位置路径中,我们可以使用一些函数取得所需的元素,如下表所示: 8-24
8.4 在XML文件使用XSLT • XSLT的语法 • XSLT的语法和CSS相似,其基本的语法,如下所示: <?xml-stylesheet type="text/xsl" href="ch8-3.xslt" ?> 上述指令使用PI关键词xml-stylesheet指定XML文件使用的XSLT Script档案,各参数的说明,如下所示: • type属性:使用的样式种类,XSLT和XSL为text/xsl。 • href属性:XSLT Script档案的路径,通常使用的扩展名为.xslt或.xsl,本书是使用.xsl,XML Spy预设使用.xslt。 8-25
8.4 在XML文件使用XSLT 示例:XML文件 01: <?xml version="1.0" encoding=“gb2312"?> 02: <?xml-stylesheet type="text/xsl" href="ch8-3.xsl" ?> 03: <hello>大家好!</hello> 8-26
8.4 在XML文件使用XSLT XSLT文件:Ch8-3.xsl 01: <?xml version="1.0" encoding=“gb2312"?> 02: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 03: <xsl:template match="/"> 04: <html> 05: <head><title>测试XSLT</title></head> 06: <body> 07: <h2><center><xsl:value-of select="hello"/></center></h2> 08: </body> 09: </html> 10: </xsl:template> 11: </xsl:stylesheet> 8-27
8.4 在XML文件使用XSLT 8-28
8.5 XSLT的基本架构 • XSLT的基本架构和XML一样,在宣告为一份XML文件后,接着就是根标签<xsl:stylesheet>,如下所示: <?xml version="1.0" encoding=“gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> …… …… </xsl:template> </xsl:stylesheet> 8-29
XSLT的元素 8-30
8.5 XSLT的基本架构 • XRay XML Editor编辑与转换XSLT Script XRay XML Editor支援XSLT的編輯和轉換,請啟動XRay載入XML和XSLT Script 後,就可以使用XSLT轉換輸出成 HTML 文件,如下圖所示: 8-31
8.6 XSLT的范本元素 • 范本程序設計 • 內容元素xsl:value-of • 范本元素xsl:template • 递归范本元素xsl:apply-templates 8-32
A B C D a b c d 1 2 3 8.6 XSLT的范本元素 • 范本程序設計 XSLT Script属于一种模板程序设计,不同于传统或对象导向的程序设计拥有固定的程序执行流程,整份XSLT Script只是在定义XML元素的模板规则,所有的XML元素需要拥有对应的模板,以便定义转换的规则,如下图所示: 8-33
8.6 XSLT的范本元素 • 內容元素xsl:value-of • 选择元素的内容 在XML文件使用XSLT进行转换时,我们需要取得XML元素的内容,只需指定select属性的元素名称即可,例如:item元素的模板,如下所示: <xsl:template match="item"> <b><xsl:value-of select="title" /></b> </xsl:template> 上述指令当XSLT处理器找到item元素时,上述模板xsl:value-of的select属性取得title元素的内容,而且将它插入HTML标签<b>。 8-34
8.6 XSLT的范本元素 • 选择属性的内容 如果转换输出的为XML元素的属性,我们需要在属性前加上「@」符号,如下所示: <xsl:template match="title"> <u><xsl:value-of select="@version"/></u> </xsl:template> 8-35
8.6 XSLT的范本元素 • HTML卷标的属性内容 如果输出的HTML卷标属性为XML元素的属性,卷标不能写成下面的格式,如下所示: <img src="<xsl:value-of select='@version'/>"/> 上述标签拥有「<」所以并不符合HTML卷标语法,如果发生这种情况,请使用「{」和「}」括起,如下所示: <img src="{@version}"/> 上述卷标属性使用{}取代xsl:value-of元素。 8-36
8.6 XSLT的范本元素 • 模板元素xsl:template-1 模板元素的语法 <xsl:template match="/"> …… </xsl:template> 上述开始标签<xsl:template … >和</xsl:template>结尾卷标间的就是模板定义的转换规则,XSLT处理器会将此范本套用在match属性指定的元素,这也包括其下的子元素,以此例match属性的模型为「/」,这指的是根节点和其下的所有元素。 8-37
8.6 XSLT的范本元素 • match属性 xsl:template元素最重要的属性就是match,这个属性值就是XPath指出元素的位置路径,一些match属性的元素,如下表所示: 8-38
8.6 XSLT的范本元素 • 递归模板元素xsl:apply-templates • 递归模板元素的语法 <xsl:template match="item"> <b><xsl:value-of select="title" /></b> <xsl:apply-templates select="definition"/> </xsl:template> 上述模板元素的模型为item,拥有两个子元素title和definition,其中definition也拥有同名的子元素title,如果没有递归模板元素,XSLT处理器就到item元素为止。 8-39
8.6 XSLT的范本元素 • 如果使用递归模板元素,处理器会递归继续找寻子节点,此时有两种情况,如下所示: • 没有select属性:继续找寻所有的子节点,也就是title和definition元素,再次找寻是否有符合的范本,继续执行转换。 • 拥有属性select:select属性能够指定开始的元素,以上述为例,就是由item子元素definition开始,如此就不包括子元素title。 8-40
8.7 XSLT的回路元素 • 回路元素xsl:for-each 对于XML文件的重复元素,xsl:for-each回路元素如同第六章Data Island的<TABLE>卷标,可以显示所有XML元素的内容。 <xsl:for-each select="booklist/book"> ….. </xsl:for-each> • 上述回路元素的select属性指定显示的元素,以此例显示所有的book元素,卷标内容可以使用xsl:value-of元素输出XML元素的内容。 8-41
8.7 XSLT的回路元素 • 过滤XML元素的select属性 • 在使用xsl:for-each回路时,如果不想显示所有的XML元素,我们可以在select属性加上过滤条件,只显示符合条件的元素,如下所示: <xsl:for-each select="booklist/book[@sales='Y']"> • 上述回路的条件为book元素属性sales是Y,详细的条件语法就是XPath,请参阅第8-2节的说明。 8-42
8.7 XSLT的回路元素 • 排序元素xsl:sort • HTML标签的内容无法进行排序的处理,但是XSLT Script拥有排序元素,能够指定XML元素进行排序。 <xsl:sort select="title" order="descending"/> • 上述元素的select属性指定排序的元素,order属性指定是由小到大的ascending或decending由大到小。 • 排序元素可以是xsl:for-each或xsl:apply-templates的子元素,XSLT处理器在输出前就会依指定的元素进行排序。 8-43
8.8 XSLT的条件元素 • 单一条件元素xsl:if • 目前的XSLT Script都是直接输出转换的结果,但是在转换时我们可能需要测试一些情况,以决定是否转换,这就属于单一条件元素。 <xsl:if test="@sales = 'Y'"> ……… </xsl:if> • 上述xsl:if元素使用test属性指定XPath条件,如果条件为True处理子元素,否则就不处理。 8-44
8.8 XSLT的条件元素 • 多条件元素xsl:choose 如果在条件处理上需要多条件,我们可以使用xsl:choose、xsl:when、xsl:otherwise元素建立多条件元素。 <xsl:choose> <xsl:when test="price > 500"> …… </xsl:when> <xsl:when test="price = 500"> ……. </xsl:when> <xsl:otherwise> …… </xsl:otherwise> </xsl:choose> 8-45
8.9 XSLT的函数元素 • 呼叫函数元素xsl:call-template 建立模板函数 <xsl:template name="showbook"> ………. </xsl:template> 上述模板并不是XML元素的模板,而是使用name属性建立一个名为showbook的模板函数。 8-46
8.9 XSLT的函数元素 • 呼叫模板函数元素 <xsl:call-template name="showbook"> ……. </xsl:call-template> 上述xsl:call-template元素呼叫模板函数,name属性指定模板函数的名称,以此例是呼叫showbook。 8-47
8.9 XSLT的函数元素 • 模板函数的参数传递 <xsl:template name="showbook"> <xsl:param name="position" select="/booklist/book"/> …….. </xsl:template> 如果模板函数需要传入参数,只需在xsl:template元素插入子元素xsl:param,每一个xsl:param元素为一个参数,name属性为参数名称,select属性为参数的默认值,当呼叫模板函数时没有传入参数,就是使用select属性的默认值。 8-48
8.9 XSLT的函数元素 • 在元素插入JavaScript程序代码 如果转换的HTML文件拥有JavaScript程序代码,此时的<SCRIPT>标签需要使用CDATA区块,如下所示: <SCRIPT language="JavaScript"> <xsl:comment><![CDATA[ ….. …. ]]></xsl:comment> </SCRIPT> 8-49
8.10 XML元素的转换技巧 • 复制元素、删除元素和更改元素名称-1 • 复制元素xsl:copy 如果XML元素名称是输出元素的名称,我们可以直接使用xsl:copy元素输出XML元素名称,例如:XML元素title,如下所示: <xsl:template match="title"> <xsl:copy> <xsl:apply-template/> </xsl:copy> </xsl:template> 上述模板元素直接将title元素输出成同名的元素。 8-50