Frage

Ich möchte eine Vorlage mit unterschiedlichen Parametern auf dem Ergebnis eines bedingten Basis anzuwenden. So etwas wie folgt aus:

<xsl:choose>
    <xsl:when test="@attribute1">
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Attribute no. 1</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes"><xsl:value-of select="@attribute1"/></xsl:with-param>
        </xsl:apply-templates>
    </xsl:when>
    <xsl:when test="@attribute2">
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Attribute no. 2</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes"><xsl:value-of select="@attribute1"/></xsl:with-param>
        </xsl:apply-templates>
    </xsl:when>
    <xsl:otherwise>
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Error</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes">No matching attribute   </xsl:with-param>
            </xsl:apply-templates>
    </xsl:otherwise>
</xsl:choose>

Zunächst einmal, ich vermute, dass dies in eine viel, viel besser Weise gelöst werden kann. (Ich bin ganz neu in XSLT, so wenden Sie sich bitte Verbesserungen vorschlagen und den aufgeblähten Code vergeben.)

Nun zur Frage: Wie kann ich die Parameter auf diesem bedingten Basis festgelegt habe, und verwenden sie noch in einem xsl:apply-templates? Ich habe versucht, die gesamte xsl:choose mit einem xsl:apply-templates Start- / End-Tag zu wickeln, aber das ist offenbar nicht legal. Irgendwelche Hinweise?

War es hilfreich?

Lösung

Eine alternative Methode wäre, die xsl zu setzen: wählen Aussagen im xsl: param Elemente

<xsl:apply-templates select="." mode="custom_template">
   <xsl:with-param name="attribute_name" tunnel="yes">
      <xsl:choose>
         <xsl:when test="@attribute1">Attribute no. 1</xsl:when>
         <xsl:when test="@attribute2">Attribute no. 2</xsl:when>
         <xsl:otherwise>Error</xsl:otherwise>
      </xsl:choose>
   </xsl:with-param>
   <xsl:with-param name="attribute_value" tunnel="yes">
      <xsl:choose>
         <xsl:when test="@attribute1"><xsl:value-of select="@attribute1"/></xsl:when>
         <xsl:when test="@attribute2"><xsl:value-of select="@attribute1"/></xsl:when>
         <xsl:otherwise>No matching attribute </xsl:otherwise>
      </xsl:choose>
   </xsl:with-param>
</xsl:apply-templates>

Andere Tipps

Nichts falsch mit Ihrer Methode, aber Sie können auch Ihre bedingtes in xsl:template match Attribut anhängen. Dies wird nur ein xsl:apply-templates führen, sondern mehrere xsl:template Elemente

Sie können alle diese Logik und die Modi loszuwerden, indem Sie Ihre Bedingungen in Prädikate zu extrahieren. Was Sie nicht sagen, was der Name des Elements Sie mit zu tun sind, aber vorausgesetzt, es foo dann wie etwas, das nennt sollte genügen:

<xsl:template match="foo[@attribute1]">
    <!-- 
         do stuff for the case when attribute1 is present 
         (and does not evaluate to false) 
    -->
</xsl:template>

<xsl:template match="foo[@attribute2]">
    <!-- 
         do stuff for the case when attribute2 is present 
         (and does not evaluate to false)
    -->
</xsl:template>

<xsl:template match="foo">
    <!-- 
         do stuff for the general case  
         (when neither attribute1 nor attribute 2 are present) 
    -->
</xsl:template>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top