2016-06-09 127 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指令。)