有人说,XSLT表达式的完全的覆盖已证明是一个太大的主题以至于在一个单独的指南提示里面是难以被完全覆盖的。因此,在这部分里,我们涉及到了在表达式中使用的XSLT 变量和数据类型, 并且将在我们的下一个提示里更加深入地在XSLT 表达式里挖掘。同时,这个提示可以让你深入XPath,而XPath为XSLT 表达式和相关的变量和数据结构奠定了基础。请继续读下去,这些东西肯定有它的意义的。
XSLT 表达式是真正的XPath 表达式(他们在句法、结构和使用中是一样的)。 理解XSLT/Xpath 表达方式而不用同时理解XSLT/XPath 变量和数据类型,这是不可能的,因此我们通过这里的这些题目来介绍一下。 请在再XSLT 辅导系列初级建议中咨询在这些题目中需要的另外的信息,讨论和例子
变量:和很多编程语言一样, XSLT设置变量为全局(贯穿整个XSLT文档和上下文)或者本地(贯穿一个模板体)。如果一个变量说明(经常地都是这种形式: )出现在一份XLST文档的顶部(使它成为一个xsl:stylesheet或者其他有效的文档元素的孩子) ,使它成为全局性的; 如果一个变量说明在一个模板体内(使它成为一些xsl:template的孩子),它是本地的。
数据类型: XSLT是一种动态类型的语言,意味着数据类型与数值有关而不是变量,这和在JavaScript或者VBScript里的方式是基本类似的。 XSLT在它的命名和行为过程中跟随XPath,并且在处理的上下文要求时,自动认识到在类型之间的变换发生时的5 种不同的数据类型。 显式类型转换函数的名字是string(), number() 和boolean()他们用于强制类型转换。表格1分别描述数据类型; 表格2 描述在对类型之间的全部有效的变换 (N/A 表明变换不允许或者不能实行,以及把一种类型转化成它自己时)。
表 1: XSLT Data Types
| boolean | 逻辑变量可能赋值为真或者假,而这些值是通过调用true()和false()来分别实现的。逻辑的比较运算符«=»(等于)和«!=»(不等于)可能与逻辑算符玜«and» 和 «or»以及逻辑函数not()相结合。 Boolean 变量必须总是或者是真或者是假; 空值和未定义的值是不允许的。 |
| number | 数是64 位双精度浮点数,根据浮点运算的IEEE 754标准定义。 这在java的使用中也是采用相同的方案的。有效的操作符包括数值比较 («<», «<=», «>», «>=»), 数值相等(«=»,«!=») ,一元的负(«-»), 乘法 («*»,«div»,«mod»),附加的(«+»,«-»), 数值选择函数round(), ceil() 和floor()把数转化成整数, 并且函数sum()计算一系列节点的值的总和。number()函数把任何值转化成数,string()和format-number()函数把字符串转化成数, boolean()函数数转化成boolean价值。 |
| string | 任何0或更多字符值的序列,有可能的字母表和Unicode的映射。 字符串值是一个一个字符连接起来的,由单引号或者双引号括起来的,比如'Bob'或者"Alice" (这个机制被设计来用于允许把一类引号看作字符,但是因为XPath表达式通常在XML属性里面出现,这不能按照预计的工作; 其它引号符号已经被"Taken"(占用)了)。使用字符实体来为了最好的结果用文字再生必要半临界和敏感句法。 比较字符串使用«=», «!=»操作符。 translate()函数可以用于在大写和小写字母字符之间转换。 string-length()函数返回被包括进来的XML字符串的长度的数值(并非所有的16位Unicode符号代码)。 |
| node-set | 在一棵原始文档树里的一套节点, 当多原始文档树正在使用中的时候,一个节点集可能集合不止一棵树上的节点。在一节点集里的任何节点可能是任何类型节点,并且不同的类型能在的相同的节点集内发生。一个节点仅仅能在一个节点集里出现一次,但是出现的顺序比没有关系 (虽然节点倾向于被在"文档顺序"映射它们在源文档树中的位置)。 一个单个的节点采取作为一个节点集的一名单独的成员的形式。 |
| tree | 类型树的值(正式的称为结果树碎片)包含一个根节点,而根孩子可能有零或更多的子节点。 作为一个碎片, 一个树的值不是一定要对良构的XML文档做出反应,并且也可能以很多方式违犯良构的限制 (根节点可能直接拥有正文节点; 多个元素节点可能在它的孩子中出现)。树的值仍然必须坚持适用于一个外部解析XML 实体的规则, 意思是全部属性必须有独特的名字并且全部属性值被正确地描述,等等。 一旦他们被建造,XSLT在树上只支持两个操作: 他们可能被复制到当前的目的地树(一些其他树变量的结果树使用 或者树价值可能变为一串字符串,从而使那棵树里全部正文节点的级联)。树通过处理一个声明被建造。 在listing 1的中XSLT 碎片构造了Listing 2在一个实在的树的实例。 |
