如何在xslt 1.0中进行模板调用

时间:2016-06-09 15:27:02

标签: xslt xslt-1.0

我有以下模板,我不确定是否正确

<xsl:template match="text()" name="createName">
  <xsl:param name="Type"/>
     <xsl:if test="contains(Type,'NEW')">
       <xsl:value-of select="concat('New','Goal')"/>
     </xsl:if>
    <xsl:if test="contains(Type,'AMD')">
       <xsl:value-of select="concat('Amended','Goal')"/>
     </xsl:if>
</xsl:template>

在此处调用此模板

<xsl:element name="PackageName">
                 <xsl:call-template name="createName">
                     <xsl:with-param name="Type" select="s0:PIXField/s0:TransactionID"/>
                 </xsl:call-template>
              </xsl:element>

s0:PIXField / s0:TransactionID = BPA201605311506452806320060A1AMD

我想创建具有值&#39;修订目标&#39;的PackageName元素。 但是现在我得到了空的PackageName。不知道我的代码失败了。 请帮忙。

1 个答案:

答案 0 :(得分:0)

如果要访问参数,则需要使用$前缀。也就是说,做contains($Type,'NEW')而不是contains(Type,'NEW')。后者正在寻找一个名为Type的子元素,而不是传入的参数

试试这个模板。请注意,您实际上不需要使用xsl:value-ofconcat来输出文本。

<xsl:template match="text()" name="createName">
  <xsl:param name="Type"/>
     <xsl:if test="contains($Type,'NEW')">
       <xsl:text>New Goal</xsl:text>
     </xsl:if>
    <xsl:if test="contains($Type,'AMD')">
       <xsl:text>Amended Goal</xsl:text>
    </xsl:if>
</xsl:template>

另请注意,如果模板仅作为命名模板被调用,您实际上可能不需要模板上的match属性。

另请考虑使用xsl:choose / xsl:when代替xsl:if

您可以使用与问题中显示的完全相同的方式调用此模板

<xsl:element name="PackageName">
    <xsl:call-template name="createName">
         <xsl:with-param name="Type" select="s0:PIXField/s0:TransactionID"/>
    </xsl:call-template>
</xsl:element>

根本没有任何变化。