Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

XSLT 模板概述

XSLT 脚本由一组或多组规则组成,称为模板。每个模板都是一个代码段,其中包含匹配指定节点时要应用的规则。您可以使用元素<xsl:template>来构建模板。

有两种类型的模板,命名和未命名(或匹配),以下各节介绍了这两种模板。

未命名(匹配)模板

不命名模板(也称为匹配模板)包含一个 match 包含 XPath 表达式的属性,用于指定应调用模板的节点的标准。在以下示例中,该模板适用于名为 route 的元素,该元素是当前上下文的子元素 next-hop ,其值以字符串 10.10.开头。

默认情况下,XSLT 处理文档时,它会递归遍历整个文档层次结构,检查每个节点,并查找与当前节点匹配的模板。找到匹配模板后,将评估该模板的内容。

<xsl:apply-templates> 元素可以在未命名的模板中用于限制和控制 XSLT 对节点的默认层次遍历。 <xsl:apply-templates> 如果元素有 select 属性,则只会遍历与属性定义的 XPath 表达式匹配的节点。否则,将遍历 上下文节点 的所有子项。 select 如果属性已包含在内,但与任何节点不匹配,则不会遍历任何内容,也不会发生任何操作。

在以下示例中,模板规则与 XML 层次结构中的元素匹配<route>。将处理包含属性changed的所有节点。包含属性的所有<route>元素都会替换为元素<new>changed

通过使用不命名模板,脚本可以忽略标记在 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: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的元素节点的内容,该节点是当前上下文节点的子节点。

有关说明如何在提交脚本中使用指定模板的示例,请参阅 示例:要求和限制配置语句