1 / 52

Ajax 编程技术 第八章 XSLT 和 XPath

Ajax 编程技术 第八章 XSLT 和 XPath. 8.1 概述. 近年来,浏览器的主要改进之一就是它添加了可扩展样式表语言转换 (Extensible Stylesheet Language Transformation, XESLT) 处理程序。而在这之前, XSLT 被用来将一个 XML 文档的指定部分转换成另一个 XML 文档。 XSLT 的主要优点: 使文档结构和 Web 页面中内容及表现方式的分离。

Download Presentation

Ajax 编程技术 第八章 XSLT 和 XPath

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ajax编程技术第八章 XSLT和XPath

  2. 8.1 概述 近年来,浏览器的主要改进之一就是它添加了可扩展样式表语言转换(Extensible Stylesheet Language Transformation, XESLT)处理程序。而在这之前,XSLT被用来将一个XML文档的指定部分转换成另一个XML文档。 • XSLT的主要优点: • 使文档结构和Web页面中内容及表现方式的分离。 • 可以使用其他XML语言(例如XPath)对XML文档进行查询。我们不必每次否访问数据库进行查询。只要从服务器得到XML文档后,在客户端就可以决定使用其中哪些数据。 • 使用XPath从XML 文档中选择和查询数据比使用JavaScript的效率更高更简单。 • 还可以使用层叠样式表(CSS)添加样式,而样式表也可以使用这种方式来控制页面的显示方式。我们还可以使用XSLT把普通XML文档展示得精美绝伦。 8-2

  3. 8.1 概述 • XSLT的缺点 • 用XSLT做的事情差不多都可以用JavaScript和DOM实现; • XSLT不仅增加了返回给客户端的文件大小,而且其结构也使得习惯于HTML和CSS技术人不认同; • 浏览器存在兼容性问题,IE和Firefox使用或呈现XSLT主要元素的方式不同。 8-3

  4. 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

  5. 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

  6. 8.2 XSLT及其用途 • XSLT处理器能够将XML文件的来源文件,经过XSLT的范本比对处理后,产生输出的HTML或XML文件,如下图所示: 8-6

  7. Web服务器 XSLT处理器 XSLT XML XSLT处理器 HTML浏览程序 XSLT 显示文件内容 8.2 XSLT及其用途 • XSLT处理器架构 整个XSLT处理器的转换架构,如下图所示: 8-7

  8. CSS与XSLT的差异 • 虽然CSS和XSLT都可以将XML元素的内容,在浏览程序显示所需的内容,其差异如下表所示: 8-8

  9. 8.3 什么是XPath • XPath是一种语言,但它并不属于SQL类的查询语言,它只是一种节点位置的语言,用来描述XML元素的位置,如同硬盘文件夹的文件路径,如下所示: C:\xml\Chap8\Ch8-3.xml 上述路径指出文件Ch8-3.xml的位置,XPath指令则是指出XML元素的位置,也就是树状结构节点的位置,使用类似数据夹路径一般的字符串,定义出XML元素节点的位置,目前XPath语言同时被XSL和XPointer所采用,作为XML元素位置的描述语言。 8-9

  10. 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

  11. XPath资料模型 8-11

  12. XPath资料模型 • XPath逻辑树状结构的节点种类,如下表所示: 8-12

  13. XPath的位置路径 • XPath语言的主要目的就是描述节点相对其它节点的位置,也就是选择那些符合条件的节点,我们称为「位置路径」(Location Path),位置路径的运算子,如下表所示: 8-13

  14. XPath的位置路径 • 所有元素的位置路径 • XML文件的所有元素,也就是XPath的根节点,如下所示: / • 上述位置路径为根节点下的所有XML元素。 8-14

  15. XPath的位置路径 • 子元素的位置路径 对于指定的元素,我们可以使用「/」正确的指出是那一个title元素,如下所示: /glossary/item/title 上述位置路径和下面的路径属于不同的title元素,如下所示: /glossary/item/definition/title 如果需要指出上述两个title元素,此时就需要使用「//」运算子,如下所示: //title 上述指的是根节点下所有的title元素,XML文件只要有title元素都符合此位置路径。 8-15

  16. XPath的位置路径 通配符「*」 • 通配符「*」代表所有的元素和属性,如下表所示: 8-16

  17. XPath的位置路径 • 属性的位置路径 如果位置路径属于属性,此时就需要使用「@」符号,如下所示: /glossary/item/title/@version 上述位置路径是从根节点开始,一层一层向下找寻子元素title,找到后传回version属性的值。 8-17

  18. XPath的位置路径 • 节点的索引条件 XML元素的可能拥有同名的多个子元素,对于同名的元素,我们可以使用「[」和「]」符号定义元素的索引条件,如下表所示: 8-18

  19. XPath的位置路径 • 节点间的关系- 轴(Axis)1 轴是指节点的关系,可以指出节点搜寻的方向,用来在XML文件找寻所需的元素。 在XPath的位置路径使用轴,可以配合使用前面的索引条件,如下所示: axis::node[predicate] 上述路径的轴之后是使用「::」符号连接索引条件。 8-19

  20. XPath的位置路径 • 节点间的关系- 轴(Axis)2 8-20

  21. XPath的位置路径 • 节点间的关系- 轴(Axis)3 一些位置路径的范例 ,如下表所示: 8-21

  22. XPath的位置路径 • 节点间的关系- 轴(Axis)4 轴位置路径相当于一些位置路径的运算子,如下表所示: 8-22

  23. XPath的位置路径 • 节点的组合条件 如果位置路径的条件不只一个,此时我们可以组合各条件以选择所需的元素,请使用「|」符号组合各条件,如下表所示: 8-23

  24. XPath的函数 • 在位置路径中,我们可以使用一些函数取得所需的元素,如下表所示: 8-24

  25. 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

  26. 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

  27. 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

  28. 8.4 在XML文件使用XSLT 8-28

  29. 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

  30. XSLT的元素 8-30

  31. 8.5 XSLT的基本架构 • XRay XML Editor编辑与转换XSLT Script XRay XML Editor支援XSLT的編輯和轉換,請啟動XRay載入XML和XSLT Script 後,就可以使用XSLT轉換輸出成 HTML 文件,如下圖所示: 8-31

  32. 8.6 XSLT的范本元素 • 范本程序設計 • 內容元素xsl:value-of • 范本元素xsl:template • 递归范本元素xsl:apply-templates 8-32

  33. A B C D a b c d 1 2 3 8.6 XSLT的范本元素 • 范本程序設計 XSLT Script属于一种模板程序设计,不同于传统或对象导向的程序设计拥有固定的程序执行流程,整份XSLT Script只是在定义XML元素的模板规则,所有的XML元素需要拥有对应的模板,以便定义转换的规则,如下图所示: 8-33

  34. 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

  35. 8.6 XSLT的范本元素 • 选择属性的内容 如果转换输出的为XML元素的属性,我们需要在属性前加上「@」符号,如下所示: <xsl:template match="title"> <u><xsl:value-of select="@version"/></u> </xsl:template> 8-35

  36. 8.6 XSLT的范本元素 • HTML卷标的属性内容 如果输出的HTML卷标属性为XML元素的属性,卷标不能写成下面的格式,如下所示: <img src="<xsl:value-of select='@version'/>"/> 上述标签拥有「<」所以并不符合HTML卷标语法,如果发生这种情况,请使用「{」和「}」括起,如下所示: <img src="{@version}"/> 上述卷标属性使用{}取代xsl:value-of元素。 8-36

  37. 8.6 XSLT的范本元素 • 模板元素xsl:template-1 模板元素的语法 <xsl:template match="/"> …… </xsl:template> 上述开始标签<xsl:template … >和</xsl:template>结尾卷标间的就是模板定义的转换规则,XSLT处理器会将此范本套用在match属性指定的元素,这也包括其下的子元素,以此例match属性的模型为「/」,这指的是根节点和其下的所有元素。 8-37

  38. 8.6 XSLT的范本元素 • match属性 xsl:template元素最重要的属性就是match,这个属性值就是XPath指出元素的位置路径,一些match属性的元素,如下表所示: 8-38

  39. 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

  40. 8.6 XSLT的范本元素 • 如果使用递归模板元素,处理器会递归继续找寻子节点,此时有两种情况,如下所示: • 没有select属性:继续找寻所有的子节点,也就是title和definition元素,再次找寻是否有符合的范本,继续执行转换。 • 拥有属性select:select属性能够指定开始的元素,以上述为例,就是由item子元素definition开始,如此就不包括子元素title。 8-40

  41. 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

  42. 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

  43. 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

  44. 8.8 XSLT的条件元素 • 单一条件元素xsl:if • 目前的XSLT Script都是直接输出转换的结果,但是在转换时我们可能需要测试一些情况,以决定是否转换,这就属于单一条件元素。 <xsl:if test="@sales = 'Y'"> ……… </xsl:if> • 上述xsl:if元素使用test属性指定XPath条件,如果条件为True处理子元素,否则就不处理。 8-44

  45. 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

  46. 8.9 XSLT的函数元素 • 呼叫函数元素xsl:call-template 建立模板函数 <xsl:template name="showbook"> ………. </xsl:template> 上述模板并不是XML元素的模板,而是使用name属性建立一个名为showbook的模板函数。 8-46

  47. 8.9 XSLT的函数元素 • 呼叫模板函数元素 <xsl:call-template name="showbook"> ……. </xsl:call-template> 上述xsl:call-template元素呼叫模板函数,name属性指定模板函数的名称,以此例是呼叫showbook。 8-47

  48. 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

  49. 8.9 XSLT的函数元素 • 在元素插入JavaScript程序代码 如果转换的HTML文件拥有JavaScript程序代码,此时的<SCRIPT>标签需要使用CDATA区块,如下所示: <SCRIPT language="JavaScript"> <xsl:comment><![CDATA[ ….. …. ]]></xsl:comment> </SCRIPT> 8-49

  50. 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

More Related