电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> XML专区>>XML教程第14章 XSL变换 -2:

XML教程第14章 XSL变换 -2

来源:远方网络 | 2006-2-26 | (有1818人读过)

="."告诉格式化程序取匹配的元素(本例中的ATOM)的值。

第二种方法是使用xsl:for-each。xsl:for-each元素依次处理由其select特性选择的每个元素。不过,无需任何附加的模板。例如:

<xsl:template match="PERIODIC_TABLE">

<xsl:for-each select="ATOM">

<xsl:value-of select="."/>

</xsl:for-each>

</xsl:template>

如果省略select特性,那么处理源节点(本例中的PERIODIC_TABLE)的所有子节点。

<xsl:template match="PERIODIC_TABLE">

<xsl:for-each>

<xsl:value-of select="ATOM"/>

</xsl:for-each>

</xsl:template>

14.6 匹配节点的模式

xsl:template元素的match特性支持复杂的语法,允许人们精确地表达想要和不想要与哪个节点匹配。xsl:apply-templates、xsl:value-of、xsl:for-each、xsl:copy-of和xsl:sort的select特性支持功能更加强大的语法的超集,允许人们精确地表达想要和不想要选择哪个节点。下面讨论匹配和选择节点的各种模式。

14.6.1 匹配根节点

为了使输出的文档结构整洁。从XSL变换的第一个输出内容应为输出文档的根元素。因此,XSL样式单一般以应用于根节点的规则开始。要在规则中指定根节点,可将其match特性设置为合适的值。例如:

<xsl:template match="/">

<html>

<xsl:apply-templates/>

</html>

</xsl:template>

本规则应用于根节点,并且只应用于输入树形结构的根节点。当读取到此根节点时,就输出<html>标记,处理根节点的子节点,然后输出</html>标记。本规则推翻了根节点的缺省规则。**14-6显示了应用于根节点的带有单一规则的样式单。

**14-6:用于根节点的带有单一规则的XSL样式单

<?xml version="1.0"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">

<xsl:template match="/">

<html>

<head>

<title>Atomic Number vs. Atomic Weight</title>

</head>

<body>

<table>

Atom data will go here

< /table>

</body>

</html >

</xsl:template>

</xsl:stylesheet>

由于本样式单只为根节点提供一条规则,并且由于规则的模板未指明对子节点进行进一步的处理,因而只是按原样输出,所以在模板中所看到的所有内容都将插入到结果文档中。换句话说,将**14-6中的样式单应用于**14-1(或其他任何结构整洁的XML文档)中,所获得的结果如下:

<html><head><title>Atomic Number vs. Atomic

Weight</title></head><body><table>

Atom data will go here

</table></body></html>

14.6.2 匹配元素名

正如前面介绍的那样,最基本的模式只包含一个元素名,用来匹配所有带有该名的元素。例如,下面的模板与ATOM元素相匹配,并将ATOM元素的ATOMIC_NUMBER的子元素标成粗体:

<xsl:template match="ATOM">

<b><xsl:value-of select="ATOMIC_NUMBER"/><b>

</xsl:template>

**14-7显示的是扩充了**14-6的样式单。首先,在根节点的规则模板中包括了xsl:apply-templates元素。此规则使用select特性来确保只有PERIODIC_TABLE元素获得处理。

其次,使用match="PERIODIC_TABLE"语句创建了只适用于PERIODIC_TABLE元素的规则。本规则设置周期表的标题,然后应用模板来从ATOM元素中生成周期表的主体。

最后,ATOM规则使用<xsl:apply-templates select="NAME"/>、<xsl:apply-templates select="ATOMIC_NUMBER"/>和<xsl:apply templates select="ATOMIC_WEIGHT"/>,明确地选择ATOM元素的NAME、ATOMIC_NUMBER和ATOMIC_WEIGHT子元素。它们都包装在HTML的tr和td元素中,以便最终的结果是与原子量相匹配的原子序数表。图14-4显示将**14-7中的样式单应用于整个周期表文档中的输出结果。

对本样式单需要注意的是:在输入文档中的NAME、ATOMIC_NUMBER和ATOMIC_WEIGHT元素的精确顺序是不重要的。它们在输出文档中以选择它们的顺序出现,也就是说首先为原子序数,然后是原子量。相反,在输入文档中,各个原子依字母顺序排序。以后,将会看到如何使用xsl:sort元素来改变这个顺序,以便使用更常规的原子序数的顺序来排列原子。

**14-7:利用select的施用于元素的特定类的模板

<?xml version="1.0"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">

<xsl:template match="/">

<html>

<head>

<title>Atomic Number vs. Atomic Weight</title>

</head>

<body>

<xsl:apply-templates select="PERIODIC_TABLE"/>

</body>

</html>

</xsl:template>

<xsl:template match="PERIODIC_TABLE">

<hl>Atomic Number vs. Atomic Weight</hl>

<table>

<th>Element</th>

<th>Atomic Number</th>

<th>Atomic Weight</th>

<xsl:apply-templates select="ATOM"/>

</table>

</xsl:template>

<xsl:template match="ATOM">

<tr>

<td><xsl:value-of select="NAME"/></td>

<td><xsl:value-of select="ATOMIC_NUMBER"/></td>

<td><xsl:value-of select="ATOMIC_WEIGHT"/></td>

</tr>

</xsl:template>

</xsl:stylesheet>

图14-4 Netscape Navigator 4.5中显示的原子序数与原子量的关系表

14.6.3 使用/字符匹配子节点

在match特性中并不局限于当前节点的子节点,可使用/符号来匹配指定的元素后代。当单独使用/符号时,它表示引用根节点。但是,在两个名称之间使用此符号时,表示第二个是第一个的子代。例如,ATOM/NAME引用NAME元素,NAME元素为ATOM元素的子元素。

在xsl:template元素中,这种方法能够用来只与某些给定类型的元素进行匹配。例如,下面的模板规则将ATOM子元素的SYMBOL元素标记为strong。此规则与不是ATOM元素的直系子元素的SYMBOL元素无关。

<xsl:template match="ATOM/SYMBOL">

<strong><xsl:value-of select="."/></strong>

</xsl:template>

请记住,本规则选择的是作为ATOM元素子元素的SYMBOL元素,而不是选择拥有SYMBOL子元素的ATOM元素。换句话说,在<xsl:value-of select="."/>中的.符号引用的是SYMBOL,而不是ATOM。

将模式写成一行的形成,就可以指定更深层的匹配。例如,PERIODIC_TABLE / ATOM / NAME选择的是其父为ATOM元素(其父为PERIODIC_TABLE元素)的NAME元素。

还可以使用*通配符来代替层次结构中的任意元素名。例如,下面的模板规则应用于PERIODIC_TABLE孙元素的所有SYMBOL元素。

<xsl:template match="PERIODIC_TABLE/*/SYMBOL">

<strong><xsl:value-of select="."/></strong>

</xsl:template>

最后一点,就如上面所看到的那样,单独的/本身,表示选择文档的根节点。例如,下面的规则应用于文档根元素的所有PERIODIC_TABLE元素。

<xsl:template match="/PERIODIC_TABLE">

<html><xsl:apply templates/></html>

</xsl:template>

虽然 / 引用根节点,但/* 则引用任意根元素。例如,

<xsl:template match="/*">

<html>

<head>

<title>Atomic Number vs. Atomic Weight</title>

</head>

<body>

<xsl:apply-templates/>

</body>

</html>

</xsl:template>

14.6.4 使用//符号匹配子代

有时候,尤其是使用不规则的层次时,更容易的方法就是越过中间节点、只选择给定类型的所有元素而不管这些元素是不是直系子、孙、重孙或其他所有的元素。双斜杠(//)引用任意级别的后代元素。例如,下面的模板规则应用于PERIODIC_TABLE的所有NAME子代,而不管它们具有何种层次的关系:

<xsl:template match=" PERIODIC_TABLE //NAME">

<i><xsl:value-of select="."/></i>

</xsl:template>

周期表实例相当简单,一看就懂,但这种技巧在更深层次,尤其是当元素包含该类的其他元素时(例如ATOM包含ATOM),就显得更加重要。

模式开头的操作符选择根节点的任何子节点。例如,下面的模板规则处理所有的ATOMIC_NUMBER元素,而同时完全忽略其位置:

<xsl:template match="// ATOMIC_NUMBER ">

<i><xsl:value-of select="."/></i>

</xsl:template>

14.6.5 通过ID匹配

有人或许想把一特定的样式应用于特定的单一元素中,而不改变该类型的所有其他元素。在XSL中实现此目的的最简单的方法是,将样式与元素的ID匦韵喙亓?墒褂胕d()选择符(其中包括以单引号括起来的ID值)做到这一点。例如,下面的规则使带有ID值为e47的元素变为粗体:

<xsl:template match="id('e47')">

<b><xsl:value-of select="."/></b>

</xsl:template>

当然,上面假设以此方式选择的元素具有在源文档的DTD中声明为ID类型的特性。但是,通常情况并非如此。首先,许多文档没有DTD,只不过结构整洁,但不合法。即使有DTD,也无法确保任何元素都有ID类型的特性。可以在样式单中使用xsl:key元素,用来把输入文档中的特定特性声明为应该作为ID来看待。

14.6.6 使用@来匹配特性

正如第5章已经看到的那样,@符号根据特性名与特性相匹配,并选择节点。方法很简单,只需在要选择的特性前加上@符号。例如,**14-8显示一样式单,用它来输出一张原子序数和熔点对照的表格。不仅写出了MELTING_POINT的值,而且也写出了UNITS特性的值。这是由于<xsl :value-of select="@UNITS"/>所获得的结果。

**14-8:使用@来选择UNITS特性的XSL样式单

<?xml version="1.0"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">

<xsl:template match="/PERIODIC_TABLE">

<html>

<body>

<hl>Atomic Number vs. Melting Point</hl>

<table>

<th>Element</th>

<th>Atomic Number</th>

<th>Melting Point</th>

<xsl:apply-templates/>

</table>

</body>

</html>

</xsl:template>

<xsl:template match="ATOM">

<tr>

<td><xsl:value-of select="NAME"/></td>

<td><xsl:value-of select="ATOMIC_NUMBER"/></td>

<td><xsl:apply-templates select="MELTING_POINT"/></td>

</tr>

</xsl:template>

<xsl:template match="MELTING_POINT">

<xsl:value-of select="." />

<xsl:value-of select="@UNITS"/>

</xsl:template>

</xsl:stylesheet>

回想一下,特性节点的值只是此特性的字符串值。一旦应用**14-8中的样式单,ATOM元素就会格式化成如下形成:

<tr><td>Hydrogen</td><td>l</td><td>13.8lKelvin</td></tr>

 

<tr><td>Helium</td><td>2</td><td>0.95Kelvin</td></tr>

可以使用各种层次操作符将特性与元素组合起来。例如,BOILING_POINT/@UNITS引用BOILING_POINT元素的UNITS特性。ATOM/*/@UNITS就能匹配ATOM子元素的任何UNITS元素。当与模板规则中的特性匹配时,这种做法是特别有用的。必须记住,要匹配的是特性节点,而不是包含它的元素。最常见的错误是,不知不觉地将特性节点与包含它的元素节点搞混淆。例如,请看下面的规则,它试图将模板应用于具有UNITS特性的所有子元素:

<xsl:template match="ATOM">

<xsl:apply-templates select="@UNITS"/>

</xsl:template>

上面语句实际上做的是,将模板应用于ATOM元素中并不存在的UNITS特性。

也可以使用*来选择元素的所有特性,例如,BOILING_POINT/@*可选择BOILING_POINT元素的所有特性。



14.6.7 使用comments()来匹配注释

大多数时候,可能应该完全忽略XML文档中的注释。要使注释成为文档的必不可少的部分,确实不是好主意。但是,当不得不选择注释时,XSL确实提供了选择注释的手段。

为了选择注释,可使用comment()模式。尽管此模式有类似函数的圆括号,但实际上决不带任何参数。要区分不同的注释不太容易。例如,回想一下DENSITY元素具有如下的形式:

<DENSITY UNITS="grams/cubic centimeter"><!- At 300K ->

6.51

</DENSITY>

此模板规则不仅输出密度的值和单位,而且还打印测量密度的条件:

<xsl:template match="DENSITY">

<xsl:value-of select="."/>

<xsl:value-of select="@UNITS"/>

<xsl:apply-templates select="comment()"/>

</xsl:template>

**14-1使用注释而不是特性或元素来指定条件,就是为了用于本例。实际应用时,决不要将重要信息放在注释中。XSL允许人们选择注释的唯一真实的理由是,为了用样式单把一种标记语言变换成另一种标记语言,同时又能使注释保持不变。选择注释的任何其他方面的用途都意味着原文档设计得不好。下面的规则匹配所有的注释,并使用xsl:comment元素将它们再次复制出来。

<xsl:template match="comment()">

<xsl:comment><xsl:value-of select="."/></xsl:comment>

</xsl:template>

可是,要注意,用于施加模板的缺省规则对注释无效。因此,遇到注释时,如果要使缺省规则起作用,需要包括xsl:apply-templates元素,无论注释放在何处,此元素都能选择注释。

使用层次操作符可以选择特定的注释。例如,下面的规则匹配DENSITY元素内部的注释:

<xsl:template match="DENSITY/comment()">

<xsl:comment><xsl:value-of select="." /></xsl:comment>

</xsl:template>

14.6.8 使用pi()来匹配处理指令

谈到编写结构化的、智能化的、可维护的XML时,处理指令并不比注释好。但是都有一些必需的应用,其中包括将样式单附加到文档上。

pi()函数选择处理指令。pi()的参数是放在引号内的字符串,表示要选择的处理指令的名称。如果没有参数,则匹配当前节点的第一个处理指令子节点。但是,可以使用层次操作符。例如,下面的规则匹配根节点的第一个处理指令子节点(很可能是xml-stylesheet处理指令)。xsl:pi元素使用指定的名称和输出文档中的值来插入一个处理指令。

<xsl:template match="/pi()">

<xsl:pi name="xml-stylesheet">

type="text/xsl" value="auto.xsl"

</xsl:pi>

</xsl:template/>

下列规则也匹配xml-stylesheet处理指令,但是通过其名称来匹配的:

<xsl:template match="pi( xml-stylesheet )">

<xsl:pi name="xml-stylesheet">

<xsl:value-of select="."/>

</xsl:pi>

</xsl:template/>

事实上,区分根元素和根节点的主要原因之一就是,为了读取和处理序言中的处理指令。尽管xml-stylesheet处理指令使用"名称=值"这样的句法,但XSL并不把它们当做特性看待,这是因为处理指令不是元素。处理指令的值只是跟在其名称后面的空格和结束符?>之间的所有内容。

用来施加模板的缺省规则并不匹配处理指令。因此,遇到xml-stylesheet处理指令时,如果要使缺省规则起作用,需要包括xsl:apply-templates元素,此元素在适当的地方匹配缺省规则。例如,下面这个用于根节点的模板确实将模板应用于处理指令:

<xsl:template match="/">

<xsl:apply-templates select="pi()"/>

<xsl:apply-templates select="*"/>

</xsl:template>

14.6.9 用text()来匹配文本节点

尽管文本节点的值包括在选择的元素值部分中,但它们作为节点通常被忽视。但是,text()操作符确实能够明确选择一个元素的文本子元素。尽管这种操作符有圆括号,但不需要任何参数。例如:

<xsl:template match="SYMBOL">

<xsl:value-of select="text()"/>

</xsl:template>

此操作符存在的主要原因是为了用于缺省规则。无论作者是否指定缺省规则,XSL处理程序必须提供下列的缺省规则:

<xsl:template match="text()">

<xsl:value-of select="."/>

</xsl:template>

这意味着无论何时将模板应用于文本节点,就会输出此节点的文本。如果并不需要这种缺省行为,可以将其推翻。例如,在样式单中,包括下列空模板规则,将会阻止输出文本节点,除非另外的规则明确地匹配。

<xsl:template rnatch="text()">

</xsl:template>

14.6.10 使用"或"操作符|

竖线(|)允许一条模板规则匹配多种模式。如果节点与某种模式相匹配,则此节点将激活该模板。例如,下面模板规则与ATOMIC_NUMBER和ATOMIC_WEIGHT元素都匹配:

<xsl:template match="ATOMIC_NUMBER|ATOMIC_WEIGHT">

<B><xsl:apply-templates/></B>

</xsl:template>

也可以在|两边加入空格,这样使代码更清晰。例如:

<xsl:template match="ATOMIC_NUMBER | ATOMIC_WEIGHT">

<B><xsl:apply-templates/></B>

</xsl:template>

还可以顺次使用两个以上的模式。例如,下面的模板规则作用于A

14.7 选择节点的表达式

在xsl:apply-templates、xsl: value-of、xsl:for-each、xsl:copy-of和xsl:sort中,可使用select特性来精确指定对哪个节点进行操作。此特性值即为表达式(expression)。表达式是前节讨论的匹配模式的超集。也就是说,所有的匹配模式都是选择表达式,但并非所有的选择表达式都是匹配模式。让我们来回顾一下,匹配模式能够使用元素名、子元素、后代以及特性来匹配节点,除此之外,还可以对这些项目进行简单的测试。选择表达式可以使用所有的这些条件来选择节点,而且还可以通过参考父元素、同属元素来选择节点,以及通过更加复杂的测试来选择节点。此外,表达式并不局限于只生成一组节点列表,而且还产生布尔值、数值和字符串。

14.7.1 节点轴

表达式并不局限于指定当前节点的子节点和后代节点。XSL提供许多轴(axe),使用这些轴可以从相对于当前节点(通常为模板匹配的节点)的树形结构的不同部分进行选择。表14-2概述了这些轴及其含义。

 

表14-2 表达式的轴



选自于

from-ancestors()

当前节点的父节点、当前节点的父节点的父节点、当前节点的父节点的父节点的父节点,依次类推至根节点

from-ancestors-or-self()

当前节点的后代以及当前节点本身

from-attributes()

当前节点的特性

from-children()

当前节点的直系子节点

from-descendants()

当前节点的子节点、当前节点的子节点的子节点,依次类推

from-descendants-or-self()

当前节点本身及其后代节点

from-following()

起始于当前节点末尾之后的所有节点

from-following-siblings()

起始于当前节点末尾之后并且与当前节点具有同一个父节点的所有节点

from-parent()

当前节点的单一父节点

from-preceding()

当前节点开始之前开始的所有节点

from-preceding- siblings()

当前节点开始之前开始的所有节点并且与当前节点具有同一个父节点的所有节点

from-self()

当前节点

from-following和from-preceding轴不可靠,可能不会包括在XSL的最终发布版中。如果包括在XSL的最终发布版中,其准确的含义可能会改变。

这些轴的功能是选择表14-2第二列中列出的节点。圆括号中包括要进一步对此节点列表筛选的选择表达式。例如,可能包括由下列模板规则选择的元素名称:

<xsl:template match="ATOM">

<tr>

<td>

<xsl:value-of select="from-children(NAME)"/)

</td>

<td>

<xsl:value-of select="from-children(ATOMIC_NUMBER)"/>

</td>

<td>

<xsl:value-of select="from-children(ATOMIC_WEIGHT)"/>

</td>

</tr>

</xsl:template>

此模板规则匹配ATOM元素。当ATOM元素匹配时,NAME元素、ATOMIC_NUMBER元素和ATOMIC_WEIGHT都从此匹配的ATOM元素的子元素中选择,并作为表的单元格输出。(如果有多个期待的元素��例如,三个NAME元素��那么,只选择第一个。)

from-children()轴不允许做单独使用元素名不能做的任何事情。实际上,select="ATOMIC_WEIGHT"只是select = "from-children (ATOMIC_WEIGHT)"的缩写形式。但是,其他轴更令人感兴趣。

在匹配模式时引用父元素是不合法的,但在选择表达式中引用则是合法。要引用父元素,可使用from-parent()轴。例如,下面的规则输出具有BOILING_POINT子元素的ATOM元素的值:

<xsl:template match="ATOM/BOILING_POINT">

<P><xsl:value-of select="from-parent(ATOM)"/></P>

</xsl:template>

这里匹配的是BOILING_POINT子元素,但输出的是ATOM父元素。

有些放射性原子(如钋)其半衰期是如此之短,以致无法测量重要的性质(如沸点和熔点)。所以并非所有的ATOM元素都必须有BOILING_POINT子元素。上面的规则可用来只输出实际上有沸点的元素。**14-10是此例的扩展,它匹配BOILING_POINT元素,但实际上使用from-parent(ATOM)输出ATOM父元素。

**14-10:只输出有已知熔点的元素的样式单

<?xml version="1.0"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">

<xsl:template match="/">

<html>

<body>

<xsl:apply-templates select="PERIODIC_TABLE"/>

</body>

</html>

</xsl:template>

<xsl:template match="PERIODIC_TABLE">

<hl>Elements with known Melting Points</hl>

<xsl:apply-templates select="//MELTING_POINT"/>

</xsl:template>

<xsl:template match="MELTING_POINT">

<P>

<xsl:value-of select="from-parent(ATOM)"/>

</P>

</xsl:template>

</xsl:stylesheet>

偶尔,可能需要选择给定类型元素的最近的祖先。使用from-ancestors()就可以做到这一点。例如,下面的规则插入最近的PERIODIC_TABLE元素(包含匹配的SYMBOL元素)的值。

<xsl:template match="SYMBOL">

<xsl:value-of select="from-ancestors(PERIODIC_TABLE)"/>

</xsl:template>

from-ancestors-or-self()函数的作用与from-ancestors()函数相似,所不同的是,如果当前节点与参数类型匹配,那么它的返回值为其本身,而不是真正的祖先。例如,下面的规则匹配所有元素。如果匹配的元素是PERIODIC_TABLE,那么在xsl:value-of中选择的正是PERIODIC_TABLE。

<xsl:template match="*">

<xsl:value-of select="from-ancestors-or-self(PERIODIC_TABLE)"/>

</xsl:template>



14.7.1.1 节点类型

from-axis()函数的参数,除了可以使用节点名称和通配符之外,还可以是下列四个节点类型函数之一:

* comment()

* text()

* pi()

* node()

comment()节点类型选择注释节点。text()节点类型选择文本节点。pi()节点类型选择处理指令节点,而node()节点类型选择任何类型的节点(*通配符只选择元素节点)。pi()节点类型还有一个可选的参数,用来指定要选择的处理指令的名称。

例如,下面的规则同时使用带有node()节点类型的from-self(),将匹配的ATOM元素封装在P元素中:

<xsl:template match="ATOM">

<P><xsl:value-of select="from-self(node())"/></P>

</xsl:template>

这里,选择from-self(node())与选择ATOM是不同的。下面的这个规则获取ATOM元素的ATOM子元素的值。此值不是匹配的ATOM元素的值,而是匹配ATOM元素的一个子元素的另一个ATOM元素值:

<xsl:template match="ATOM">

<P><xsl:value of select="ATOM"/></P>

</xsl:template>

14.7.1.2 层次操作符

可以使用/和//操作符来将选择表达式串联在一起。例如,**14-11只将有熔点的那些元素的元素名、原子序数和熔点打印成表。要实现此目的,选择MELTING_POINT元素的父元素,然后使用select="from-parent(*)/from-children(NAME)"来查找父元素的NAME和ATOMIC_NUMBER子元素。

**14-11:熔点与原子序数表

<?xml version="1.0"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">

<xsl:template match="/PERIODIC_TABLE">

<html>

<body>

<hl>Atomic Number vs. Melting Point</hl>

<table>

<th>Element</th>

<th>Atomic Number</th>

<th>Melting Point</th>

<xsl:apply-templates select "from-children(ATOM)"/>

</table>

</body>

</html>

</xsl:template>

<xsl:template match="ATOM">

<xsl:apply-templates

select="from-children(MELTING_POINT)"/>

</xsl:template>

<xsl:template match="MELTING_POINT">

<tr>

<td>

<xsl:value-of

select="from-parent(*)/from-children(NAME)"/>

</td>

<td>

<xsl:value-of

select="from-parent(*)/from-children(ATOMIC_NUMBER)"/>

</td>

<td>

<xsl:value-of select="from-self(*)"/>

<xsl:value-of select="from-attributes(UNITS)"/>

</td>

</tr>

</xsl:template>

</xsl:stylesheet>

这并不是解决这一问题的唯一方法。另外一种可能的方法是使用from-preceding-siblings()和from-following-siblings()轴或相对位置(前面或后面)不确定时同时使用两者。用于MELTING_POINT元素的必要模板规则如下所示:

<xsl:template match="MELTING_POINT">

<tr>

<td>

<xsl:value-of

select="from-preceding-siblings(NAME)

| from-following-siblings(NAME)"/>

</td>

<td>

<xsl:value-of

select="from-preceding-siblings(ATOMIC_NUMBER)

| from-following-siblings(ATOMIC_NUMBER)"/>

</td>

<td>

<xsl:value-of select="from-self(*)"/>

<xsl:value-of select="from-attributes(UNITS)"/>

</td>

</tr>

</xsl:template>

14.7.1.3 缩写句法

表14-2中的各种from-axis()函数对于轻松的打字工作来说过于冗长。XSL还定义了缩写句法,以便代替最常用的轴,在实际过程中使用更广。表14-3显示的是完整句法形式与缩写词的对等关系。

表14-3 选择表达式的缩写句法

缩写词

完整句法形式

.

from-self(node())

..

from-parent(node())

Name

from-children(name)

@name

from-attributes(name)

//

/from-descendants-or-self(node())/

使用缩写句法重写**14-11,得到**14-12。但这两个样式单所获得的输出结果是完全一样的。

**14-12:使用缩写句法获得的熔点和原子序数对照表

<?xml version="1.0"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/XSL/Transform/I.O">

<xsl:template match="/PERIODIC_TABLE">

<html>

<body>

<hl>Atomic Number vs. Melting Point</hl>

<table>

<th>Element</th>

<th>Atomic Number</th>

<th>Melting Point</th>

<xsl:apply-templates select="ATOM"/>

</table>

</body>

</html>

</xsl:template>

<xsl:template match="ATOM">

<xsl:apply-templates

select="MELTING_POINT"/>

</xsl:template>

<xsl:template match="MELTING_POINT">

<tr>

<td>

<xsl:value-of

select="../NAME"/>

</td>

<td>

<xsl:value-of

select="../ATOMIC_NUMBER"/>

</td>

<td>

<xsl:value-of select="."/>

<xsl:value-of select="@UNITS"/>

</td>

</tr>

</xsl:template>

</xsl:stylesheet>

匹配模式可以只使用缩写句法(并非使用所有的缩写句法)。对于选择表达式,只能使用表14-2中的from-axis()函数的完整句法形式。

XML专区热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号