9.2 绝对路径和相对路径
文件路径有相对路径和绝对路径之分。绝对路径总是以磁盘的根路径开始,在任何位置总是指向相同的文件夹或文件。而相对路径则需要依赖于当前路径(或者称为基路径),例如abc\CrazyIt.java就是一个相对路径,但该路径具体指向哪个文件却无法确定,因为它会随着基路径的改变而改变。如果当前基路径为c:\javatest,那么该相对路径就指向c:\javatest\abc\CrazyIt.java文件;如果当前基路径是g:\test,那该相对路径将指向g:\test\abc\CrazyIt.java文件。
XPath同样支持相对路径和绝对路径。对于XPath而言,绝对路径以斜线(/)开头,而相对路径则不会以斜线开头。
不管是相对路径,还是绝对路径,XPath路径表达式里都会包含一个或多个步(step),每个步之间用斜线(/)分隔。
提示
读者可能对XPath中的步(step)感到疑惑,其实完全可以将步(step)与文件路径中的文件夹进行类比。对于c:\abc\xyz\CrazyIt.java路径,其中abc、xyz都是文件夹;而对于XPath中的/abc/xyz/book路径表达式,其中abc、xyz、book都是步(step)。
例如下面的XPath就是绝对路径:
/list/book/name:该路径总是匹配list元素内的book元素之内的name子元素。
而下面的XPath则是相对路径:
list/book/name:该路径到底匹配哪个或哪些节点是不确定的,它取决于XPath的当前基路径。
9.2.1 XPath基路径
在进行XSLT转换时,XPath的基路径由XSLT决定,例如对于如下XML文档:
程序清单:codes\09\9.2\book.xml
假设定义如下的XSLT样式单文档:
程序清单:codes\09\9.2\book.xslt
上面的XSLT样式单中①号代码指定为<book…/>元素定义一个模板,在该模板定义的3个<value-of…/>子元素内都使用select指定了一个XPath表达式,该XPath表达式就是一个相对路径表达式,因此它们到底指定哪个元素取决于XPath基路径。
由于<xsl:template…/>会依次匹配XML文档中每个<book…/>元素,因此上面的XSLT中3行粗体字代码的XPath基路径会不断地发生改变。
处理第1个<book…/>元素时,<xsl:value-of select="name"/>将输出第1个<book…/>元素里<name…/>子元素的内容:疯狂Java讲义;<xsl:value-of select="author"/>将输出第1个<book…/>元素里<author…/>子元素的内容:yeeku……
处理第2个<book…/>元素时,<xsl:value-of select="name"/>将输出第2个<book…/>元素里<name…/>子元素的内容:轻量级Java EE企业应用实战;<xsl:value-of select="author"/>将输出第2个<book…/>元素里<author…/>子元素的内容:yeeku……
处理第3个<book…/>元素时,<xsl:value-of select="name"/>将输出第3个<book…/>元素里<name…/>子元素的内容:疯狂Ajax讲义;<xsl:value-of select="author"/>将输出第3个<book…/>元素里<author…/>子元素的内容:yeeku……
定义XPath路径表达式时,大多数时候都是在使用相对路径的XPath表达式,在这种情况下,务必要注意XPath的基路径。