我正在尝试理解一个工作项目的一段 XSLT 代码,但我只是无法弄清楚什么调用了什么以及如何正确传递值。
我有这段代码,它使用 apply-templates 元素来选择文档类型元素中的第一个元素:
<xsl:apply-templates select="DocumentType[string(text())][1]" mode="XmlString">
<xsl:with-param name="name" select="'DocumentType'"/>
</xsl:apply-templates>
然后将参数传递到模板中,模板分配正确的值。with-param 中的 name 属性与此处的 param 元素匹配:
<xsl:template match="*" mode="XmlString">
<xsl:param name="name"/>
<!-- Check the "name" parameter : madantory / optional -->
<xsl:call-template name="MandatoryOrOptional">
<xsl:with-param name="name" select="$name"/>
<xsl:with-param name="value" select="."/>
</xsl:call-template>
</xsl:template>
但我不确定为什么以及如何传递该值。每当需要映射值时,都会在整个映射中重复使用。
通常,我只会创建所需的标签并使用 xsl:value-of 元素从源文档中获取所需的值。如果有人能启发我这个代码在实践中是如何工作的,我将不胜感激。我使用应用模板的几次,我已经在我的 XSLT 中定义了一个模板,然后使用 match 属性来应用它。
我们认为apply-template类似于for-each,那么这种方法(即,在多个模板之间传递某些内容(很有用。在此比较中,with-param 类似于变量。
如果您需要通过多个模板传递变量,您可以在您看到的方法中执行此操作。由于在 XMLString 中分配给参数"name"的值在输入"强制"或"可选"模板时超出范围,因此在输入"强制或可选"模板时,需要一种方法来指示"名称"是什么。执行此操作的方法是将"name"作为参数传递。有效地将变量的范围扩展到新模板中。
我已经在您的代码片段中添加了注释,以尝试在"代码中"详细说明这一点。
<xsl:template match="*" mode="XmlString">
<xsl:param name="name"/>
<!--This brings the name from the first template and stores it -->
<!--This is treated as a variable with a scope of the template -->
<xsl:call-template name="MandatoryOrOptional">
<xsl:with-param name="name" select="$name"/>
<!-- This effectively expands the scope of the variable $name -->
<!-- The name sent from the first template is now in scope for MandatoryOrOptional -->
<xsl:with-param name="value" select="."/>
</xsl:call-template>
</xsl:template>
保留每个参数的 name="name" 是否是一种好的做法是有争议的,但我认为这是有道理的,并且已经使用了几次。它使通过代码跟踪"变量"变得更加容易。