XSLT 模板概述
XSLT 脚本由一组或多组规则组成,称为模板。每个模板都是一个代码段,其中包含匹配指定节点时要应用的规则。您可以使用元素<xsl:template>
来构建模板。
有两种类型的模板,命名和未命名(或匹配),以下各节介绍了这两种模板。
未命名(匹配)模板
不命名模板(也称为匹配模板)包含一个 match
包含 XPath 表达式的属性,用于指定应调用模板的节点的标准。在以下示例中,该模板适用于名为 route
的元素,该元素是当前上下文的子元素 next-hop
,其值以字符串 10.10.
开头。
<xsl:template match="route[starts-with(next-hop, '10.10.')]"> <!-- ... body of the template ... --> </xsl:template>
默认情况下,XSLT 处理文档时,它会递归遍历整个文档层次结构,检查每个节点,并查找与当前节点匹配的模板。找到匹配模板后,将评估该模板的内容。
该 <xsl:apply-templates>
元素可以在未命名的模板中用于限制和控制 XSLT 对节点的默认层次遍历。 <xsl:apply-templates>
如果元素有 select
属性,则只会遍历与属性定义的 XPath 表达式匹配的节点。否则,将遍历 上下文节点 的所有子项。 select
如果属性已包含在内,但与任何节点不匹配,则不会遍历任何内容,也不会发生任何操作。
在以下示例中,模板规则与 XML 层次结构中的元素匹配<route>
。将处理包含属性changed
的所有节点。包含属性的所有<route>
元素都会替换为元素<new>
。changed
<xsl:template match="route"> <new> <xsl:apply-templates select="*[@changed]"/> </new> </xsl:template>
通过使用不命名模板,脚本可以忽略标记在 XML 层次结构中的位置。例如,如果您希望将所有 <author>
标记 <div class="author">
转换为标记,则可以使用模板编写一个转换所有 <author>
标记的规则,而不管这些标记在输入 XML 文档中的位置如何。
有关如何在脚本中使用未命名模板的更多信息,请参阅 xsl:template match=“/” Template。
命名模板
命名模板的操作就像传统编程语言中的功能一样,但语法措辞措辞详细。当脚本的复杂性增加或代码段出现在多个位置时,您可以对代码进行模块化处理并创建指定模板。与函数类似,命名模板接受参数,仅在显式调用时运行。
您可以使用元素并定义name
属性来创建命名模板<xsl:template>
,这类似于传统编程语言中的函数名称。使用<xsl:param>
标记及其name
属性为命名模板定义参数,并根据需要包括属性select
以声明每个参数的默认值。属性select
可以包含 XPath 表达式。select
如果未定义属性,参数默认为空字符串。
以下示例创建一个模板,名为 my-template
并定义三个参数,其中一个默认为字符串 false
,其中一个默认为当前上下文节点的子节点 name
元素节点的内容。如果脚本调用模板但未传递参数,则使用默认值。
<xsl:template name="my-template"> <xsl:param name="a"/> <xsl:param name="b" select="'false'"/> <xsl:param name="c" select="name"/> <!-- ... body of the template ... --> </xsl:template>
要调用脚本中的命名模板,请使用 <xsl:call-template>
元素。属性 name
为必填属性,用于定义所调用模板的名称。处理后,元素 <xsl:call-template>
将被它命名的 <xsl:template>
元素的内容所取代。
调用命名模板时,可以通过包括<xsl:with-param>
子元素并指定name
属性来将参数传递到模板。属性的值<xsl:with-param>
name
必须与在实际模板中定义的参数匹配;否则将忽略该参数。或者,您可以使用元素的属性或内容<xsl:with-param>
为每个参数select
设置一个值。如果未在调用环境中为参数定义值,则脚本会传递参数的当前值(如果参数之前已初始化),或者,如果从未声明参数,则生成错误。有关传递参数的更多信息,请参阅 XSLT 参数概述。
在以下示例中,使用参数c
调用该模板my-template
,其中包含名为other-name
的元素节点的内容,该节点是当前上下文节点的子节点。
<xsl:call-template name="my-template"> <xsl:with-param name="c" select="other-name"/> </xsl:call-template>
有关说明如何在提交脚本中使用指定模板的示例,请参阅 示例:要求和限制配置语句。