2010-04-13 17 views
2

Comment est-il possible de réduire cet enregistrement?Optimisation <xsl: apply-templates /> pour un ensemble de variables

<xsl:template match="BR"> 
    <br/> 
</xsl:template> 

<xsl:template match="B"> 
    <strong><xsl:apply-templates /></strong> 
</xsl:template> 

<xsl:template match="STRONG"> 
    <strong><xsl:apply-templates /></strong> 
</xsl:template> 

<xsl:template match="I"> 
    <em><xsl:apply-templates /></em> 
</xsl:template> 

<xsl:template match="EM"> 
    <em><xsl:apply-templates /></em> 
</xsl:template> 

<xsl:template match="OL"> 
    <ol><xsl:apply-templates /></ol> 
</xsl:template> 

<xsl:template match="UL"> 
    <ul><xsl:apply-templates /></ul> 
</xsl:template> 

<xsl:template match="LI"> 
    <li><xsl:apply-templates /></li> 
</xsl:template> 

<xsl:template match="SUB"> 
    <sub><xsl:apply-templates /></sub> 
</xsl:template> 

<xsl:template match="SUP"> 
    <sup><xsl:apply-templates /></sup> 
</xsl:template> 

<xsl:template match="NOBR"> 
    <nobr><xsl:apply-templates /></nobr> 
</xsl:template> 
+1

Bonne question (+1). Voir ma réponse pour une solution plus dynamique. Lisez également la "règle d'identité" et ignorez-la. :) –

+0

@Dimitre Novatchev, Merci pour le conseil. J'estime nécessairement la «règle d'identité». – Kalinin

Répondre

1

Si les éléments à créer ne sont pas connu à l'avance et seulement quelques éléments connus doivent être traités dans un autre, de manière plus spécifique, voici une solution plus dynamique

<xsl:template match="*"> 
    <xsl:element name="{translate(name(), $vUpper, $vLower)}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 

$vUpper et $vLower sont définis comme:

<xsl:variable name="vUpper" select= 
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
"/> 

<xsl:variable name="vLower" select= 
"'abcdefghijklmnopqrstuvwxyz' 
"/> 

Il doit y avoir des modèles correspondant aux quelques éléments connus qui ne devraient pas être traités de la manière ci-dessus. Ces modèles plus spécifiques remplaceront le modèle plus général ci-dessus. Par exemple:

<xsl:template match="specificName"> 
    <!-- Specific processing here --> 
</xsl:template> 

En outre, le modèle générique ci-dessus, les éléments correspondants doivent être Outrepasser la "identity rule" (modèle).

+0

@Dimitre Novatchev, Eh bien, je le saurai. La seule chose qui pour moi n'est pas claire dans votre code concret est ce pour quoi les variables sont utilisées. L'ensemble des lettres reste aux constantes. – Kalinin

+0

@kalininew: Les deux variables xsl: doivent être définies globalement - alors elles peuvent être utilisées n'importe où dans le code (plus d'une fois). Cela permettra d'économiser beaucoup de frappes et rend le code beaucoup plus lisible. –

+2

Pourquoi ne pas utiliser '', afin que les attributs ne soient pas supprimés? Si la source est HTML, comme cela semble être le cas, il peut y avoir des attributs qui valent la peine d'être conservés sur les éléments 'ul',' ol' et 'li', en particulier. – markusk

2

Peut-être quelque chose comme:

<xsl:template match="LI|SUB|..."> 
    <xsl:element name="{translate(name(), 
      'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')}"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

Je ne pense pas, il y a une fonction tolower dans XSLT (au moins pas 1,0)

+0

@chris_l: Juste pour confirmer - non, il n'y a pas. – Tomalak

+0

@chris_l, Parfaitement! Fonctionne, merci. – Kalinin