我正在尝试理解一个工作项目的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属性来应用它。
答案 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;通过代码。