2016-08-30 3 views
0
Redundanz spezifische Vorlagen Attribut

ich mit der Verwendung von Vorlagen vertraut bin, die Schlüssel aus Attributen wie folgt (zB Schlüssel aus der Anwesenheit von foo): wenn ein großen Teil der Inhalte vonWie zu implementieren, ohne

<xsl:template match="something[@foo]"> 
<xsl:template match="something[not(@foo)]"> 

jedoch Diese Vorlagen sind die gleichen, gibt es einen besseren Weg, der immer noch Vorlagen verwendet, da die Community scheint, sie zu bevorzugen? Oder ist die Lösung, einfach xsl:choose zu verwenden. Es ist eindeutig vorzuziehen, keinen doppelten Code zu schreiben, der in beiden Vorlagen gepflegt werden muss.

EDIT: Hier ist mein spezifischer Satz von Vorlagen:

<xsl:template match="item[not(@format)]"> 
    <td class="{current()/../@name}_col status_all_col"> 
    <xsl:value-of select="current()"/> 
    <xsl:value-of select="@units"/> 
    </td> 
</xsl:template> 

<xsl:template match="item[@format]"> 
    <td class="{current()/../@name}_col status_all_col"> 
    <xsl:value-of select="format-number(current(), @format)"/> 
    <xsl:value-of select="@units"/> 
    </td> 

</xsl:template> 

und hier ist was ich zur Zeit wählt, habe mit:

<xsl:template match="item"> 
    <td class="{current()/../@name}_col status_all_col"> 
    <xsl:choose> 
    <xsl:when test="@format"> 
     <xsl:value-of select="format-number(current(), @format)"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="current()"/> 
    </xsl:otherwise> 
    </xsl:choose> 
    <xsl:value-of select="@units"/> 
    </td> 
</xsl:template> 
+0

Die Antwort auf den eigentlichen Inhalt der beiden Vorlagen abhängt. - PS Es ist nichts falsch daran, 'xsl: choose' zu ​​verwenden. –

+0

Ich habe meine spezifischen Vorlagen hinzugefügt. – Bryant

Antwort

0

ich auf jeden Fall xsl:choose in dieser Situation verwenden würde.


Nur um zu zeigen, wie Sie konnte Vorlagen verwenden, ohne Codewiederholung:

<xsl:template match="item"> 
    <td class="{../@name}_col status_all_col"> 
     <xsl:apply-templates select="." mode="format"/> 
     <xsl:value-of select="@units"/> 
    </td> 
</xsl:template> 

<xsl:template match="item[not(@format)]" mode="format"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="item[@format]" mode="format"> 
    <xsl:value-of select="format-number(., @format)"/> 
</xsl:template> 

Aber ich sehe nicht, welchen Vorteil dies haben würde. Im Gegenteil, es leidet unter der GOTO syndrome.


BTW, kann dies nicht das beste Beispiel sein, da ich glaube, dass in der Zahl eine leere Zeichenfolge als zweites Argument der format-number() Funktion Versorgung führen wird zurückgegeben wie sie ist.

So konnte man nur eine einzige Vorlage verwenden, um alle passen:

<xsl:template match="item"> 
    <td class="{../@name}_col status_all_col"> 
     <xsl:value-of select="format-number(current(), @format)"/> 
     <xsl:value-of select="@units"/> 
    </td> 
</xsl:template> 
+0

Danke für den Kommentar, dass Sie das Verzweigungsverhalten möglicherweise nicht benötigen. Es stellt sich jedoch heraus, dass ich ein paar nicht-nummerische Datenstücke habe und die Format-Nummer nur "NaN" für diese zurückgibt. – Bryant

+0

"* Ich habe einige nicht nummerierte Daten *" Ah, das macht Sinn. - Beachten Sie auch, dass Sie in XSLT 2.0 'xsl: next-match' verwenden können. –

Verwandte Themen