深入XSLT第五章--- 模板

深入XSLT第五章--- 模板

1 概述

当应用于源元素的规则被确定后,就要具体实现该规则的模板.一个模板能包含文字结果的元素, 字符数据和产生结果树部分的指令.指令由XSL名域中的元素来表示,可以选择后代元素来处理. 有两类这样的指令, xsl:process-children 和xsl:process; xsl:process-children指令处理源元素的邻近子元素, 而xsl:process指令处理由指定模式来选择的元素.见下例:

<xsl:template match="chapter/title">
<fo:rule-graphic/>
<fo:block space-before="2pt">
<xsl:text>Chapter </xsl:text>
<xsl:number/>
<xsl:text>: </xsl:text>
<xsl:process-children/>
</fo:block>
<fo:rule-graphic/>
</xsl:template>

2 文字结果元素

在一个模板中,样式表中不属于XSL名域的元素具体化将产生相同类型的节点;生成的元素节点会有已经对在模板树中的元素规定的属性. 文字结果元素的一个属性的值被认为是一个属性值模板:它能包含在花括号({})中的字符串. 结果元素节点的名域前缀映射是在样式表中移去映射到XSL名域的URI后的映射.因为XSL处理器只作用于属于XSL名域的元素,所以就有这样的问题:如何新建属于XSL名域的元素?URI是http://www.w3.org/TR/WD-xsl的名域如果紧接出现一个或多个的/quote成为被引用的名域.应用名域将作特殊处理.

3 命名属性集

xsl:define-attribute-set元素定义了一自命名的属性集合. "name"属性规定了属性集的名称. xsl:define-attribute-set元素的内容是一个规定属性的xsl:attribute-set元素.一个文字结果元素或者一个xsl:attribute-set元素能指定一属性集名称为xsl:use属性的值.下面的例子产生了一个称为title-style的属性集并在模板规则中使用它.

<xsl:define-attribute-set name="title-style">
<xsl:attribute-set font-size="12pt" font-weight="bold"/>
</xsl:define-attribute-set>
<xsl:template match="chapter/heading">
<fo:block xsl:use="title-style" quadding="start">
<xsl:process-children/>
</fo:block>
</xsl:template>

4 模板中的文字

模板也能包含PCDATA(Parsed Character Data). 在模板中去除空格后的每个数据字符将在结果树中产生一个数据字符.文字的数据字符也可以包装在一个xsl:text元素中.这样的包装处理可能改变空格的去除但不影响XSL处理器对字符的处理. 

5 xsl:process-children的处理

下例新建用于chapter元素的块(block) 并处理它的相邻子元素.

<xsl:template match="chapter">
<fo:block>
<xsl:process-children/>
</fo:block>
</xsl:template>

xsl:process-children指令处理当前节点的所有子节点,包括字符. 处理源树中的字符是将字符添加到结果树.因此,其中的<标记在源树中表示<字符,该源树将由内置的模板规则在结果树中转换为<字符,而当结果树具体化为一个XML文档时,<字符又将表示为< .

6 xsl:process的处理

xsl:process元素处理由一个模式选择的元素. xsl:process 元素的模式是一个选择模式,因而它被间接地定位到当前节点.下面的例子对author-group的所有author子节点进行处理:

<xsl:template match="author-group">
<fo:sequence>
<xsl:process select="author"/>
</fo:sequence>
</xsl:template>

xsl:process元素处理所有匹配规定模式的元素.字符数据不被xsl:process元素匹配.模式不能包含属性模式(AttributePattern)除非它作为属性限定(AttributeQualifier)的一部分. 模式控制了发生匹配的深度.下例处理所有author节点中first-name元素:

<xsl:template match="author-group">
<fo:sequence>
<xsl:process select="author/first-name"/>
</fo:sequence>
</xsl:template>

在模式中使用//操作符可以匹配任意的深度. 下例处理在book元素中的所有heading元素.

<xsl:template match="book">
<fo:block>
<xsl:process select=".//heading"/>
</fo:block>
</xsl:template>

7 直接处理

当结果是已知的规则结构,能够直接确定选择元素的模板是很有益的. xsl:for-each元素包括一个模板,它具体实现由select属性规定的每个选择元素.比如对下面的XML文档:

<customers>
<customer>
<name>...</name>
<order>...</order>
<order>...</order>
</customer> 
<customer>
<name>...</name>
<order>...</order>
<order>...</order>
</customer>
</customers>

下面的XSL将生成一个HTML文档,包括一个表格,其中的一行就为一个custom元素

<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Customers</TITLE>
</HEAD>
<BODY>
<TABLE>
<TBODY>
<xsl:for-each select="customers/customer">
<TR>
<TH>
<xsl:process select="name"/>
</TH>
<xsl:for-each select="order">
<TD>
<xsl:process-children/>
</TD>
</xsl:for-each>
</TR>
</xsl:for-each>
</TBODY>
</TABLE>
</BODY>
</HTML>
</xsl:template>

8 模板中的条件

XSL中有两个指令来支持条件处理: xsl:if和xsl:choose. xsl:if指令提供简单的if-then的条件选择; xsl:choose支持多条件的选择.

9 计算产生的文本

在模板中, xsl:value-of元素能用于计算产生的文本,比如通过从源树中提取文本或插入字符常数的值. 它由xsl:value-of元素通过一个规定为expr 属性值的字串表达式来实现. 字串表达式也能在文字结果元素的属性值中使用,只要将该字串表达式套入{}中.

10 宏

宏能产生结果集合还能被引用,就象一个单独的对象.在下例中,为一封装的段落定义了一个宏,在其内容之前增加“Warning!”语句.在匹配warning元素的规则中该宏被引用.

<xsl:define-macro name="warning-para">
<fo:box>
<fo:block>
<xsl:text>Warning! </xsl:text>
<xsl:contents/>
</fo:block>
</fo:box>
</xsl:define-macro>
<xsl:template match="warning">
<xsl:invoke macro="warning-para">
<xsl:process-children/>
</xsl-invoke>
</xsl:template>

时间: 2024-09-28 01:13:59

深入XSLT第五章--- 模板的相关文章

ASP.NET自定义控件组件开发 第五章 模板控件开发

大家好,我们今天来开发一个模板控件. 其实开发一个模板控件比开发一个组合控件更加简单,所以这章不难. 开发一个模板控件一般都继承CompositeControl,因为继承这个基类后,我们就省却了很多的麻烦. 所以本章我们开发的模板控件也继承于CompositeControl.大家应该还记得我们上章开发那个登录Login 控件吧,如下: 以上就是我们之前开发的登录控件,现在我们来改造它.我们的现在的这个登录控件的输入用户名和 密码的控件是TextBox,我们有时候可能想把TextBox 换成Dro

深入XSLT第四章 --- 模板规则和模式

深入XSLT --- 模板规则和模式 模板规则 模板规则由xsl:template元素来规定."match"属性标识了规则应用的源节点(集).xsl:template. 例如:一个XML文档可能包含下面的内容: This is an <emph>important</emph> point. 下列的模板规则匹配emph类型的元素,另有一个模板产生一fo:sequence 格式化对象,其font-weight属性为粗体(bold). <xsl:templat

Android群英传笔记——第五章:Android Scroll分析

Android群英传笔记--第五章:Android Scroll分析 滑动事件算是Android比较常用的效果了,而且滑动事件他本身也是有许多的知识点,今天,我们就一起来耍耍Scroll吧 一.滑动效果是如何产生的 滑动一个View的本质其实就是移动一个View,改变其当钱所在的位置,他的原理和动画效果十分的相似,就是通过不断的改变View的坐标来实现这一效果,动态且不断的改变View的坐标,从而实现View跟随用户触摸滑动而滑动 但是在讲解滑动效果之前,需要先了解一下Android中窗口坐标体

【PMP】Head First PMP 学习笔记 第五章 范围管理

第五章 范围管理 范围问题 产品范围表示你和你的团队正在构建的产品或服务的特性和功能. 项目范围是建立产品所需完成的全部工作.比如,项目计划和其他管理文档,使用产品的人看不到的,比如项目进度.规范.蓝图和预算. 范围蔓延是指导导致团队做额外工作的失控变更. 项目管理计划描述了你如何写出范围,确保范围是正确的,并保证范围不断得到更新. 范围管理的威力 团队无法启动项目 存在大量有错误的开始 赞助人和干系人难以预料 (开始谈的时候没有的需求,做完后他们居然会问为什么没有这个功能!!!) 总有大量变更

Knockout应用开发指南 第五章:创建自定义绑定

原文:Knockout应用开发指南 第五章:创建自定义绑定 创建自定义绑定 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid,tabset等这样的绑定. 重要:以下文档只应用在Knockout 1.1.1和更高版本,Knockout 1.1.0和以前的版本在注册API上是不同的.   注册你的绑定 添加子属性到ko.bindingHandlers来注册

《PHP程序设计》 第五章 中场一:数据库连接

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />          第五章 中场一:数据库连接      前两章中集中介绍了PHP语言,现在停下来开始创建一个应用程序.在本章中将创建一个连接MySQL数据库的应用程序.      在学习过前面两章之后,你肯定已经学会了怎样处理PHP内部数据,以及怎样编写语句和函数.下一步从逻辑上讲,应该到了学习如何用SQL(结构化查询语句

Frontpage2000中文教程:第五章(最后的启示)

frontpage|教程|中文 第五章 最后的启示 启示(1)定置表格 表格可以定置它的长宽,具体怎么做的?我们新建一个网页,插入一个一行一列的表格.在表格内点击鼠标右键,选择表格属性.在弹出的窗口中设置(如图1). (图1) 启示(2)设置图片热点连接 有时你可能不希望一张图片都做上连接,只想为图片的某部分做上连接,这就叫做提片热点连接.如何做到呢?我们点击一下想要做热点连接的图片,你会看到Frontpage2000会自动在编辑区下面弹出一个工具栏(如图2). (图2) 你可以使用这些工具加工

SEO从零开始第五章——新闻源与百度敏感词

  营销手段中包含了SEO,SEO是营销一部分如果想在SEO界有所成就那一定要学会网络营销手段,网络营销会了SEO自然就会了,因为SEO是根本网络营销而变的.2013年5月28日百度外链工具全新升级,我记得在SEO从零开始第2章节说过,快照全部停留在27号,28号百度肯定有动作,百度拒绝外链技术越来越成熟, 回到正题,最近很多灰色行业在大量收购百度新闻源来做百度敏感词语,先说说我自己理解的原理,先知道原理然后再推荐百度如何针对这些问题.目前主流获得敏感词语排名的方案企业,新闻源站劫持获取排名.百

&amp;gt; 第五章 类(rainbow 翻译)*1 (来自重粒子空间)

<<展现C#>> 第五章 类(rainbow 翻译)出处:http://www.informit.com\matter\ser0000002正文:第五章  类       前一章讨论了数据类型和它们的用法.现在我们转移到C#中至关重要的结构--类.没有了类,就连简单的C#程序都不能编译.这一章假定你知道了一个类的基本组成部分:方法.属性.构造函数和析构函数. C#在其中增加了索引和事件.       在这一章中,你学到下列有关类的话题.      . 使用构造函数和析构函数