2009-07-15 64 views
1

我想使用XSLT 2.0(Saxon 9.1.0.7)在我的源xml文件中處理框架元素。如果框架元素包含渲染屬性我需要從框架模板到另一個命名模板發送這個,否則我想默認渲染值發送到指定的模板。調用命名模板

所以在源XML文件,我可以有以下的,在這種情況下,我想一個默認值發送到指定的模板參數:

<frame id="menu_frame_1"> 

或者,如果渲染屬性在源XML文檔定義,那麼我想送的那個,而不是默認的:

<frame id="menu_frame_1" renderer="KONtx.element.Container"> 

我遇到的問題是我不知道如何有條件地選擇使用默認值,或定義的屬性如果存在並將其傳遞給指定的模板。我嘗試使用xsl:在調用模板內選擇,但這是不允許的。另外,我會將調用模板之外的選擇移出,並設置具有默認值或屬性值的變量,但變量是不可變的,所以我不知道如何處理這種情況。下面是框架元素的模板,以及我試圖調用的命名模板。任何幫助表示讚賞。謝謝。

<xsl:template match="frame">  
    <!-- Call new object start named template below --> 
    <xsl:call-template name="newObjectStart"> 
     <xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param> 

     <xsl:choose> 
      <xsl:when test="@renderer"> 
       <xsl:with-param name="renderer"> 
        <xsl:value-of select="@renderer" /> 
       </xsl:with-param> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:with-param name="renderer">KONtx.element.Container</xsl:with-param> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:call-template> 

    ... 
</xsl:template> 

<!-- New Object Start Named Template --> 
<xsl:template name="newObjectStart"> 
    <xsl:param name="id" /> 
    <xsl:param name="renderer" /> 

    <xsl:text>var </xsl:text> 
    <xsl:value-of select="$id" /> 
    <xsl:text> = </xsl:text>  
    <xsl:text>new </xsl:text> 
    <xsl:value-of select="$renderer" /> 
    <xsl:text>({</xsl:text> 
</xsl:template> 

回答

1

你必須把<xsl:choose><xsl:with-param>,而不是外內。

<xsl:template match="frame"> 
    <!-- Call new object start named template below --> 
    <xsl:call-template name="newObjectStart"> 
    <xsl:with-param name="id"> 
     <xsl:value-of select="@id" /> 
    </xsl:with-param> 
    <xsl:with-param name="renderer"> 
     <xsl:choose> 
     <xsl:when test="@renderer"> 
      <xsl:value-of select="@renderer" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="'KONtx.element.Container'" /> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:with-param> 
    </xsl:call-template> 

    ... 
</xsl:template> 
+0

謝謝,這個作品和非常有意義。我試圖讓我的腦袋纏住如何使用xslt。 – Steve 2009-07-15 11:36:14

0

試試這個


<xsl:choose> 
     <xsl:when test="@renderer"> 
      <xsl:call-template name="newObjectStart"> 
       <xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param> 
       <xsl:with-param name="renderer"><xsl:value-of select="@renderer" /></xsl:with-param> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:call-template name="newObjectStart"> 
       <xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param> 
       <xsl:with-param name="renderer">KONtx.element.Container</xsl:with-param> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:call-template> 

...