使用应用模板元素按参数选择和输入值



我正在尝试理解一个工作项目的一段 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" 是否是一种好的做法是有争议的,但我认为这是有道理的,并且已经使用了几次。它使通过代码跟踪"变量"变得更加容易。

相关内容

  • 没有找到相关文章

最新更新