2009-07-15 9 views
1

Ich möchte ein Frame Element in meiner XML-Quelldatei mit XSLT 2.0 (Saxon 9.1.0.7) verarbeiten. Wenn das Rahmen Element ein Renderer Attribut enthält brauche ich dies aus der Vorlage an einem anderen benannte Vorlage, sonst Rahmen senden würde Ich mag einen Standard Renderer Wert auf die benannte Vorlage senden.Aufruf benannte Vorlage

So in der XML-Quelldatei konnte ich die folgende haben, wobei in diesem Fall Ich mag würde einen Standardwert der benannten Vorlage als Parameter an:

<frame id="menu_frame_1"> 

Oder, wenn der Renderer Attribut wird in der Quelle xml doc definiert, dann würde ich mag, dass anstelle des Standard senden: entweder die Standard-oder das definierte Attribut wählen

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

Das Problem, das ich habe, ist, ich weiß nicht, wie bedingt wenn es existiert und übergeben Sie es an die benannte Vorlage. Ich versuchte mit einem xsl: Wählen Sie innerhalb einer Anruf-Vorlage, aber das ist nicht erlaubt. Auch würde ich die Wahl außerhalb der Call-Vorlage verschieben und eine Variable entweder mit dem Standardwert oder Attributwert, aber Variablen sind unveränderlich, so dass ich nicht sicher bin, wie mit diesem Fall entweder umzugehen. Unten ist die Vorlage für den Rahmen Element und die benannte Vorlage, die ich aufrufen möchte. Jede Hilfe wird geschätzt. Vielen Dank.

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

Antwort

1

Sie haben die <xsl:choose> innerhalb des <xsl:with-param> statt außen zu setzen.

<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

Danke, das funktioniert und macht durchaus Sinn. Ich versuche meinen Kopf darum zu wickeln, wie man xslt benutzt. – Steve

0

try this


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

...