首页 > 代码库 > XSLT主要元素

XSLT主要元素

1、XSL 样式表由一个或多套被称为模板(template)的规则组成。

每个模板含有当某个指定的节点被匹配时所应用的规则。

2、<xsl:template> 元素

<xsl:template> 元素用于构建模板。

match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档)。

如果存在为相同元素定义的多个处理方法,那么用 mode 可以区分它们。

<xsl:template match="/">

<table border="1">

<xsl:apply-templates select="employees/employee" mode="table"/>

</table>

<xsl:apply-templates select="employees/employee" mode="list"/>

</xsl:template>

<xsl:template match="employee" mode="table">

<tr>

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

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

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

</tr>

</xsl:template>

<xsl:template match="employee" mode="list">

<ul>

<li><xsl:value-of select="name"/></li>

<li><xsl:value-of select="age"/></li>

<li><xsl:value-of select="monthly_pay"/></li>

</ul>

</xsl:template>

注意:根据实际测试发现,如果某个节点元素没有定义其template,或者定义其template为空<xsl:template match="元素名称" />,则其下的子孙节点将不会被处理(即使为其子孙节点定义了template)。

3、<xsl:value-of> 元素用于提取某个选定节点的值。

<xsl:value-of> 元素用于提取某个选定节点的值,并把值添加到转换的输出流中:

<td><xsl:value-of select="catalog/cd/title"/></td>

<td><xsl:value-of select="catalog/cd/artist"/></td>

4、<xsl:for-each> 元素允许您在 XSLT 中进行循环。

<xsl:for-each> 元素可用于选取指定的节点集中的每个 XML 元素。

<xsl:for-each select="catalog/cd">

<tr>

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

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

</tr>

</xsl:for-each>

5、<xsl:sort> 元素用于对结果进行排序。

如需对结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素:

<xsl:for-each select="catalog/cd">

<xsl:sort select="artist"/>

<tr>

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

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

</tr>

</xsl:for-each>

6、<xsl:if> 元素

<xsl:if> 元素用于放置针对 XML 文件内容的条件测试。

语法:

<xsl:if test="expression">

...

...如果条件成立则输出...

...

</xsl:if>

如需添加有条件的测试,请在 XSL 文件中的 <xsl:for-each> 元素内部添加 <xsl:if> 元素:

<xsl:for-each select="catalog/cd">

<xsl:if test="price &gt; 10">

<tr>

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

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

</tr>

</xsl:if>

</xsl:for-each>

7、<xsl:choose> 元素

XSLT <xsl:choose> 元素用于组合 <xsl:when> 和 <xsl:otherwise> 来表达多重条件测试。

语法:

<xsl:choose>
<xsl:when test="expression">
... 输出 ...
</xsl:when>
<xsl:otherwise>
... 输出 ....
</xsl:otherwise>
</xsl:choose>

8、<xsl:apply-templates> 元素

<xsl:apply-templates> 元素可把一个模板应用于当前的元素或者当前元素的所有子节点,向 <xsl:apply-templates> 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素,否则将对所有的子元素及当前元素进行处理。

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"

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

<xsl:template match="/">

<html>

<body>

<h2>My CD Collection</h2>

<xsl:apply-templates/>

</body>

</html>

</xsl:template>

<xsl:template match="cd">

<p>

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

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

</p>

</xsl:template>

<xsl:template match="title">

Title: <span style="color:#ff0000">

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

<br />

</xsl:template>

<xsl:template match="artist">

Artist: <span style="color:#00ff00">

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

<br />

</xsl:template>

</xsl:stylesheet>

注意:如果当前节点的直接子节点没有匹配的模板,则默认会输出该元素的文本。

如果当前节点的直接子节点没有匹配的模板,则处理器会选择其孙子节点的模板进行处理。

9、XSLT <xsl:attribute> 元素

用于向输出元素(非xsl:element创建的元素)添加属性。

注释:<xsl:attribute> 元素会替换名称相同的已有属性。

<xsl:attribute name="attributename" namespace="uri">
<!-- Content:template -->
</xsl:attribute>

name属性为必须的,而namespace为可选的。

<xsl:attribute-set name="font">

<xsl:attribute name="fname">Arial</xsl:attribute>

<xsl:attribute name="size">14px</xsl:attribute>

<xsl:attribute name="color">red</xsl:attribute>

</xsl:attribute-set>

例子:

<test>

<xsl:attribute name="addAttribute" >TestAttribute</xsl:attribute>

</test>

10、<xsl:attribute-set> 元素可创建命名的属性集。该属性集(attribute-set)可作为整体应用到输出文档。

<xsl:attribute-set

name="name" use-attribute-sets="name-list">

<!-- Content:xsl:attribute* -->

</xsl:attribute-set>

name属性为必须,而use-attribute-sets为可选的,定义引用其他的属性集定义,多个使用空格分隔。

11、<xsl:call-template> 元素可调用一个指定的模板。

<xsl:call-template name="templatename">

<!-- Content:xsl:with-param* -->

</xsl:call-template>

在希望调用的时候直接调用即可,无需节点或者属性的匹配,也就是说,它会忽略所调用的模板(模板名称为templatename)的匹配模式(match)。

与apply-template元素不一样,那个是对当前元素的所有子元素进行调用指定的模板(根据匹配条件)。

或者说:apply-template是从元素匹配的角度进行模板的调用,而call-template则是根据模板名称进行模板调用。

Comment:它不同于apply-template是对当前的每个符合select的元素都循环调用对应的模板,而call-template更像是函数调用,因为它可以传递参数,对于需要所调用模板处理的元素可以使用<xsl:with-param >进行传递。

12、<xsl:with-param> 元素定义了传递给模板的参数的值。

注释:<xsl:with-param> 元素的 name 属性的值必须与 <xsl:param> 元素中的 name 相匹配,否则将忽略 <xsl:with-param> 元素,。

<xsl:with-param name="name" select="expression">

<!-- Content:template -->

</xsl:with-param>

13、<xsl:param> 元素用于声明局部或全局参数。

<xsl:param

name="name"

select="expression">

<!-- Content:template -->

</xsl:param>

其中,name是必须的,而select为xpath,是参数的默认值。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="xx">
<html>
<body>
<xsl:call-template name="show_title">
<xsl:with-param name="title" />
</xsl:call-template>
</body>
</html>
</xsl:variable>
<xsl:template name="show_title" match="/">
<xsl:param name="title" />
<xsl:for-each select="catalog/cd">
<p>Title: <xsl:value-of select="$title" /></p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

无论是<xsl:value-of或者<xsl:for-each>都使用 $变量名 引用参数值。

注意:<xsl:param> 元素上指定的值是绑定的默认值。如果调用的模板或样式表包含 <xsl:param>,传递的参数将替代默认值。

<xsl:param> 元素必须声明为 <xsl:template> 元素的直接子级。如果未声明为直接子级,<xsl:param> 元素的值将无法访问,并将出错。

14、<xsl:element> 元素

<xsl:element> 元素用于在输出文档中创建元素节点。

<xsl:element
name="name"
namespace="URI"
use-attribute-sets="namelist">
<!-- Content:template -->
</xsl:element>

name为必须,namespace、use-attribute-sets为可选,同时name及namespace可为表单式,由处理器在运行时运算得到结果。

注意:由XSL:element所创建的元素,为其添加属性必须使用use-attribute-sets来指定,而不能直接使用xsl:attribute来为其添加属性。

15、<xsl:message> 元素

定义和用法

<xsl:message> 元素可向输出写一条消息。该元素主要用于报告错误。

该元素能够包含几乎任何其他的 XSL 元素(<xsl:text> 、<xsl:value-of> 等等)。

terminate 属性允许您选择在错误发生时,是否应终止转换。

<xsl:message terminate="yes|no">

<!-- Content:template -->

</xsl:message>

输出的消息:不会放在输出文档中,而是会在控制台中红色显示所输出的消息。