使用apply-templates元素按参数

时间:2018-03-19 14:08:38

标签: xml xslt biztalk biztalk-mapper

我正在尝试理解一个工作项目的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元素从源文档中获取所需的值。如果有人能告诉我这段代码在实践中是如何运作的,我将不胜感激。我曾几次使用apply-templates,我已经在我的XSLT中定义了一个模板,然后使用match属性来应用它。

1 个答案:

答案 0 :(得分:0)

如果我们认为apply-template类似于for-each,那么这种方法(即在多个模板之间传递内容)很有用。在这种比较中,with-param类似于变量。

如果您需要通过多个模板传递变量,可以在您看到的方法中执行此操作。因为赋值给param&#34; name&#34;当您输入MandatoryOrOptional时,XMLString超出范围,您需要一种方法来指示&#34; name&#34;是您输入MandatoryOrOptional模板时。这样做的方法是通过&#34; name&#34;作为参数。有效地将变量的范围扩展到新模板中。

我已在您的代码段中添加了评论,以尝试在代码中详细说明这些内容。&#34;

<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>

保持名称=&#34; name&#34;是否是一个好习惯是值得商榷的。对于每个参数,但我认为它是有道理的,并已使用它几次。它可以更容易地遵循&#34;变量&#34;通过代码。