Un XSL template match dans *TOUS* les modes?
Est-il un moyen d'écrire une feuille de style XSL 1.0 modèle qui s'accorde à tous les modes?
Ou dois-je écrire un gabarit pour chaque mode (y compris des modèles supplémentaires pour les modes d'être ajoutées dans le futur)?
Voici ce que j'ai:
<xsl:apply-templates mode="mode1" />
...
<xsl:apply-templates mode="mode2" />
...
<!-- Do not process text content of nodes no matter in what mode -->
<!-- Is there a way to have only one template here? -->
<xsl:template match="text()" mode="mode1" />
<xsl:template match="text()" mode="mode2" />
- Je ne vais pas recommander à toute personne d'utiliser #tous dans XSLT 2.0 -- c'est trop dangereux. Par exemple, juste un peu plus générique (template matching node()) d'interférer avec un autre modèle. Beaucoup mieux est de concevoir ses modèles avec plus de soin, plus propre, de sorte que l'ensemble n'est pas nécessaire.
- Vous n'avez pas besoin de modèles vide le texte correspondant() si vous utilisez <xsl:apply-templates select="node()[not(self::text())]"/> au lieu d'utiliser <xsl:apply-templates/>
- Oui, bien sûr, vous avez raison. Cependant, votre solution implique la modification de tous les apply-templates dans le code ce qui rend l'entretien très dur et semble enclin à l'erreur pour moi.
Vous devez vous connecter pour publier un commentaire.
Prédéfinis mode:
#all
(disponible uniquement en XSLT 2.0, cependant).edit: la réplication en mode partagé de comportement avec la 1.0
Oui, pour ce faire, il faut suivre ces deux règles:
Écrire votre modèle sans un attribut de mode.
Dans le moded modèles ont un
<xsl:apply-templates>
instruction sans un attribut de mode qui en résultera dans le modèle 1. avant d'être sélectionnée pour le traitementCela résulte directement de la XSLT 1.0 spec, qui dit:
Pour résumer: Un ensemble de modèles de chaque dans un mode différent peut émettre
<xsl:apply-templates>
d'une telle manière (décrit ci-dessus), de sorte que le même spécifique, unique modèle sera sélectionné pour le traitement dans chaque cas.Si vous voulez avoir le template match dans tous les modes, alors pourquoi utilisez-vous la mode? Si vous n'utilisez pas le mode puis le template sera utilisé tout le temps. La raison pour laquelle le mode est conditionnelle, faire des choses différentes avec le même type de données. On dirait que vous voulez non modale.