2016-06-09 123 views
0

我有两个模板,这样的...一个创建普通包名称和另一个追加“ - 非”的名称,如果它通过一定的条件下,如图如何在XSLT调用模板从另一个模板1.0

<xsl:template match="text()" name="checkForAgency"> 
    <xsl:param name="Name"/> 
    <xsl:param name="Agency"/> 
    <xsl:if test="contains($Agency,'AG') "> 
    <xsl:value-of select="concat($Name,' - Non')"/> 
    </xsl:if> 
</xsl:template> 
<xsl:template match="text()" name="createPackageName"> 
    <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:if test="contains($Type,'REN') or contains($Type,'ARN')"> 
    <xsl:value-of select="concat('Renewal',' Goal')"/> 
    </xsl:if> 
</xsl:template> 

<xsl:variable name="NonAgencyPackageName"> 
    <xsl:call-template name="createPackageName"> 
    <xsl:with-param name="Type" select="ID"/> 
    </xsl:call-template> 
</xsl:variable> 
<xsl:element name="PackageName"> 
    <xsl:call-template name="checkForAgency"> 
    <xsl:with-param name="Name" select="$NonAgencyPackageName"/> 
    <xsl:with-param name="Agency" select="Output"/> 
    </xsl:call-template> 
</xsl:element> 

调用这些模板,如果ID有“新建”,包名应该有新的目标,如果输出有“AG”,那么名字应该是新的目标 - 非。 其他名称应该是新的目标。我只想要两个单独的模板。我现在得到空值了。请帮助我实现这个目标以及如何纠正它?

+0

既有匹配='和'name ='的模板我从未见过 - 它有'match ='(或许''mode = ')或'name ='但不匹配='然后,建议再次提出你的xslt书:)或显示(编辑问题)你的输入和期望的输出xmls看起来像 –

+0

@StefanHegny是正确的建议你检查你的模板:除非你在样式表的其余部分做了非常聪明的事情(如果你聪明,你不会有这个问题),在命名模板上有一个'match'属性是毫无意义的。不是非法的(具有'match'和'name'的模板都很好),但在这种特殊情况下毫无意义,因此让维护程序员感到困惑。 –

回答

0

在猜测,XPaths IDOutput没有选择您所期望的,所以所有条件都失败。由于您不提供任何XML输入,因此无法确定。

问自己几个问题:

  • 当这个代码进行评估,什么是当前元素?
  • 这个元素是否有一个名为ID的子元素?
  • 该元素的字符串值是什么?
  • 它是否有一个名为Output的子元素?
  • 它的字符串值是什么?

只有存在Output子项且其字符串值包含序列'AG'时,您生成的PackageName元素才是非空的。只有当Output子项包含'AG'且ID子项包含NEW时,它才会包含字符串'New Goal - Non'。在创造中没有力量可以使它具有'新目标'的价值,因为模板CheckForAgency要么产生一个以' - Non'结尾或者根本没有输出的值。 (您可能想了解XSLT中的choose/when指令。)

相关问题