在XSL中我们有时候需要取出文档中特定的一个元素集合,但是如何指定这个元素集合呢?这样就需要用到XPath标准。
XPath是在1999年11月16日和XSLT一起成为正式标准的。XPath是用作XSLT和XPointer的对XML文档各部分进行定位的语言。它给XSLT和XPointer(XML文件内部链接语言)提供一个共同、整合的定位语法,用来定位XML文件中各个部位。XPath除了提供一套定位语法之外,还包括一些函数,它们提供基本的数字运算、布尔运算和字符串处理功能。
XPath使用一个紧凑的、非XML的语法来方便实现XPath在XML属性值中的使用,它基于XML文档的逻辑结构,在该结构中进行导航。除了用于定位,XPath 自身还有一个子集能用于进行匹配,它能验证一个节点是否匹配某个模式。XPath把一个XML文档看成一个树或节点的模型。节点的类型可以有多种,包括元素节点、属性节点和文本节点。
XPath的基本语法由表达式构成。在计算表达式的值之后产生一个对象,这种对象有以下四种基本类型:节点集合、布尔型、数字型和字符串型 。
表达式的计算依据上下文的出现,XSLT和XPointer中分别规定了XPath表达式将在怎样的情况下出现。这些上下文的关系包括:节点、一对正整数(表明位置和大小)、一套变量绑定集合、函数库以及规定表达式范围的名域声明。其中,变量绑定是从标量名称到变量值的映射。变量的值是一个对象,可以是表达式可能得到的各种类型,也可以是其他没有规定的类型。在函数库中,每个函数有零个或多个参数,并返回一个结果。XPath定义了所有支持工具都必须实现的核心函数库。其中的函数的参数和结果都是上面涉及的四种基本类型。当然XSLT 和XPointer中还对XPath的核心函数库进行了扩展,有些函数的参数和返回结果数据类型超出了四种基本类型。
XPath基本上和在文件系统中寻找文件类似,如果路径是以"/"开头的,就表明该路径表示的是一个绝对路径,这和在UNIX系统中关于文件路径的定义是一致的。
当然XPath本身有一套完整的语法说明,类似巴克斯-诺尔范式。这里我们不想列出所有严格的定义表达式,而采用实际例子的方法来说明如何使用XPath语言。
1.关于"/,"//"的使用,见下面的例子:
1 /网站 表示选择根目录下的元素网站
2 /网站/中文网站表示选择根目录下元素网站下面的所有元素名称为中文网站的元素
3 /网站/中文网站/门户网站表示选择所有的名称为门户网站的元素,它的父节点为中文网站,而中文网站是根节点元素中文网站的孩子。
4 file://体育网站 表示选择所有元素名称为体育网站的元素。它可以在XML文档节点的任何位置。
2.关于"*"的使用,见下面的例子:
1 file://*表示所有的元素。
2 file://体育网站/足球网站表示选择所有元素名称为足球网站的元素,但是它的父节点必须是体育网站。
3 /网站/中文网站/门户网站/*表示选择节点/网站/中文网站/门户网站/下的所有元素。
4 /*/*/娱乐网站表示选择所有名称为娱乐网站的元素,前提是该元素的祖先有两层。如果和武林中门派弟子辈分相类比的话,就是表示所有第三代弟子。
3.关于XPath函数的使用
1 file://网站/中文网站[1]就是选择元素网站下的第一个中文网站元素。比如王重阳有七个弟子,按次序分别为王一、王二、….王七的话,这里相当于我们就选王一。
2 file://网站/中文网站[last()]就是选择元素网站下的最后一个中文网站元素。继续上面的比喻的话,这里相当于选王七。
3 file://网站[@id]表示选择带有属性id的名称为网站的元素。
4 file://网站[@name]表示选择具有属性名称为name的名称为网站的元素。
5 file://网站[@*]表示选择元素网站,它具有一些属性,但可以是任意属性。
6 file://网站[not(@*)]表示选择元素网站,该元素不具有任何属性。
7 file://网站[@id='WebSite']表示选择元素网站,该元素的属性id的值为WebSite。
8 file://体育网站[@name='www.football.com']表示选择元素体育网站,该元素有一个属性名称为name,值为'www.football.com'。
9 file://*[count(体育网站)=2]表示选择有两个子元素,并且子元素名称为体育网站的元素。
10 file://*[count(*)=n]表示选择有n个子元素的元素。
11 file://*[name()='体育网站']选择所有名称为体育网站的元素,等效于//体育网站
12 file://*[start-with(name()='网站')]选择所有元素名称开始为网站的元素
13 file://*contains(name),'网站')]选择所有名称包括网站这个单词的元素
14 file://*[string-length(name())=n]选择所有有n个字符的元素
15 file://*[string-length(name())
16 file://*][string-length(name())=n]选择所有字符个数大于n的元素
17 position()函数表示选择特定位置的元素,比如//网站[position() mod 2=0]表示所有位置在偶数行的元素。
18 file://网站//BBS 选择所有元素名称为网站或者BBS的元素
4.关于XPath中轴的概念的使用
1 file://child::网站等效于//网站
2 descendant表示当前上下文节点下的所有子元素,这里的子元素不仅包括该节点直接的子元素,还包括它所有子元素的子元素。也就是这个节点下的所有元素。
比如:/descendant::*等效于//*,也就是表示所有的元素。
3 parent表示当前节点的父元素,例子://体育网站/parent::*表示体育网站这个元素的所有父节点的集合。
4 Ancestor表示当前节点的所有祖先节点,所以不仅包括该元素的直接父节点,还包括父节点的父节点等等。用一棵树表示节点层次关系的话,所有该节点的上层都叫做Ancestor。例子://足球网站/ancestor::*就表示所有足球网站元素的祖先节点。
5 Following-sibling表示当前节点的所有在它之后的兄弟节点:例子://体育网站/follwing-sibling::*表示所有和体育网站这个元素在一个层次上的元素集合。
6 Preceding-sibling表示当前节点的所有在它之前的兄弟节点:例子://体育网站/follwing-sibling::*表示所有在体育网站这个元素之前的一个层次上的元素集合。
7 Following表示在文档中后出现的所有节点,不包括属性节点和名字空间(namespace)节点。
8 Preceding表示在文档中前面出现的所有节点,不包括属性节点和名字空间(namespace)节点。
9 Descendant-or-self和descendant的区别在于它同时包括了上下文节点本身。ancestor-or-self和ancestor的区别在于它同时包括了上下文节点本身。注意下面的一行代码,它表示了文档中的所有节点。
file://XXX/ancestor::* XXX/descendant::* XXX/following::* XXX/preceding::* XXX/self::*进入讨论组讨论。
(出处:http://www.knowsky.com)