调用命名模板

时间:2009-07-15 11:21:21

标签: xslt

我想使用XSLT 2.0(Saxon 9.1.0.7)在源xml文件中处理 frame 元素。如果 frame 元素包含渲染器属性,我需要将其从 frame 模板发送到另一个命名模板,否则我想发送一个默认渲染器值到命名模板。

所以在源xml文件中我可以有以下内容,在这种情况下,我想将一个默认值作为参数发送到命名模板:

<frame id="menu_frame_1">

或者,如果在源xml doc中定义了渲染器属性,那么我想发送它而不是默认值:

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

我遇到的问题是我不知道如何有条件地选择默认属性或已定义属性(如果存在)并将其传递给命名模板。我尝试在调用模板中使用 xsl:choose ,但这是不允许的。另外,我会在调用模板之外移动选择,并使用默认值或属性值设置变量,但变量是不可变的,所以我不知道如何处理这种情况。下面是 frame 元素的模板,以及我试图调用的命名模板。任何帮助表示赞赏。感谢。

<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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

...