返回首页
当前位置: 主页 > 航空资料 > 计算机 >

XML高级编程上(113)

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin 点击:
  
9.4.2 循环
循环是我们在过程语言中经常使用的命令。X S LT也支持循环命令,使用< x s l : f o r- e a c h . . . / >方
式。它的内容被重复执行直到最初X M L文档中的元素符合指定的属性。举一个例子,我们能够使
用f o r- e a c h命令把X M L书列表文档转换成表项在列表文档中列出的X H T M L文档。下面是一个
X S LT程序完整的清单,你将看到使用上的一些有趣的事情:
程序清单9 - 2 1
你可能注意到的第一件事情是它使用了与以往例子不同的格式。该程序仅仅包含了简单的
第9章转换XML使用335 下载
模板固定匹配根元素。事实上,在这个二选一的格式中包括< x s l : t e m p l a t e >这样的命令是没有必
要的。这个固定的模板是<xsl:template match=“/”>。
我们创建的表每个< I T E M >包含一行。在这个例子中,我们不能使用模板匹配机制,我们使
用f o r- e a c h命令循环始终贯穿程序,使用v a l u e - o f命令获取元素内容:
程序清单9 - 2 2
我们告诉处理器,“对根< B O O K L I S T >元素中的每一个< I T E M >元素,写< T I T L E >、
< C AT E G O RY >、< R E L E A S E _ D AT E >和< P R I C E >元素的内容进入表中”。循环命令的标准是从根
开始的一个XPa t h表达式;因此,我们不得不显式地包含在文档树的分支中每一个< I T E M >的元
素。当不再有元素满足条件时循环才能结束。
为了包含表单元格中的值,我们使用< x s l : v a l u e - o f . . . / >元素。与你所设想的一样,它获取了
匹配s e l e c t属性的XPa t h表达式的节点的数据内容。
结果输出显示在图9 - 1 4中。
图9-14
9.4.3 排序
在我们的数据列表中移动数据,加入新的数据,连接合成文档到C S S样式表,之后,让我们
加入排序。目标是先按照种类排序,再按照题目排序。
用到这个方法的X S L命令是< x s l : s o r t >。为了让X S LT引擎排序,我们包括s e l e c t属性设置到
XPa t h值。举个例子,按题目排序,我们使用下面的命令:
问题是:我们怎么找到包含这种用法的例子。它是仅仅被使用在< x s l : a p p l y - t e m p l a t e s . . . / >或
336使用XML 高级编程
下载
者< x s l : f o r- e a c h . . . >元素中的一个指令元素,下面这个示例是对“循环”一节中示例的修改:
程序清单9 - 2 3
现在,< x s l : f o r- e a c h . . . >元素在怎样处理被选择的节点上采用了新的指令。引擎在用模板匹配
节点之前对它们进行排序。在上面的例子中,节点首先按照种类排序,然后按照题目排序,像
图9 - 1 5显示的一样。
图9-15
排序的次序按照< x s l : s o r t . . . / >中指定的元素次序排列。举个例子,下面的命令将替代
< T I T L E >和< R E L E A E _ D AT E >对节点排序。
第9章转换XML使用337 下载
记住,< s o r t >命令在对节点进行处理前,先对节点进行重新排序(参见图9 - 1 6)。
图9-16
9.4.4 条件处理
在过程语言中经常使用的另外一种命令是:
• if命令,在X S LT中以< x s l : i f >表示。
• if/elseif命令,在X S LT中以< x s l : c h o o s e >表示。
在这一点上,你可以想象声明语言X S LT包含许多程序命令。事实上,产生声明语言是让你
不必显式地告诉X S LT引擎输出特定的内容。若对其指定内容或者模板,都将包含在输出结果中。
尽管如此, X S LT仍然有一定的过程化特性。
现在看来前一个例子,仅仅想要在结果树中包含< I T E M S >的部分S c r i p t i n g种类。为了这样
做,我们需要一个过滤器,或一个i f命令,指出引擎“如果碰到这种情况就这样做”。为了达到
这种结果,我们在模板中包括< x s l : i f >指令元素,像下面的例子这样:
程序清单9 - 2 4
338使用XML 高级编程
下载
排序应用于源
XML文档树
根据排序后的
树创建HTML表
现在,在循环中我们包含了一个被满足的条件。如果条件是真,模板中包含在< x s l : i f >中的
元素被插入结果树中。否则,模板仅仅被跳过了。
在t e s t属性中,我们比较字符串S c r i p t i n g和< C AT E G O RY >元素的数据内容。实际上,我们使
用c o n t a i n s ( )函数检验是否< C AT E G O RY >元素文本节点包含S c r i p t i n g字符串。首先,如果字符串
s t r i n g 1包含字符串s t r i n g 2,c o n t a i n s ( s t r i n g 1 , s t r i n g 2 )函数返回布尔类型的T R U E,就像我们在上一
章看到的判断部分。s t r i n g 1被使用< C AT E G O RY >数据内容的C AT E G O RY/text() XPa t h表达式包
含。一个元素数据内容总是一个字符串。
你可能注意到在属性的值中,我们对字符串使用表达式' S c r i p t i n g '替代了" S c r i p t i n g ",使用单
引号而不是双引号。这是因为仅仅整个属性的值能被双引号括起来。因此,任何需要被括起来
的表达式,像例子中的字符串那样,仅能使用单引号,像下面的表达式这样:
图9 - 1 7的H T M L文档的模式显示了使用转换样式表。
图9-17
有时我们需要一个命令显示依赖于项目匹配的某种动作。例如,在前一个例子中,我们用
过滤基本树的方法去转换S c r i p t i n g类< I T E M >的一部分。在下一个例子中,我们将使用基于种类
类型的不同的转换。
在这个例子中,我们想要表的每一行使用不同的颜色,每一个种类类型使用不同的颜色。
我们可以使用i f / e l s e i f方法,以< x s l : c h o o s e >元素的形式。这种形式总是和< x s l : w h e n >元素同时使
用的。每一个条件被< x s l : w h e n >命令判断,更独特的这种方式的判断属性:
 
中国航空网 www.aero.cn
民航翻译 www.aviation.cn
本文链接地址:XML高级编程上(113)
 
------分隔线----------------------------