Question

Quelle est la meilleure façon d’inclure une entité HTML dans XSLT ?

<xsl:template match="/a/node">
    <xsl:value-of select="."/>
    <xsl:text>&nbsp;</xsl:text>
</xsl:template>

celui-ci renvoie un XsltParseErreur

Était-ce utile?

La solution

Vous pouvez utiliser la section CDATA

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

ou vous pouvez décrire &nbsp dans la DTD locale :

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

ou utilisez simplement &#160; au lieu de &nbsp;

Autres conseils

Il est également possible d'étendre l'approche de la 2ème partie de La réponse d'aku et obtenez toutes les références de personnages connues disponibles, comme ceci :

<!DOCTYPE stylesheet [
  <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
      "http://www.w3.org/2003/entities/2007/w3centities-f.ent">
  %w3centities-f;
]>
...
<xsl:text>&nbsp;&minus;30&deg;</xsl:text>

Il y a une certaine différence dans le résultat par rapport à <xsl:text disable-output-escaping="yes"> approche.Ce dernier va produire des chaînes littérales comme &nbsp; pour tous types de production, même pour <xsl:output method="text">, et cela peut s'avérer différent de ce que vous pourriez souhaiter...Au contraire, obtenir des entités définies pour le modèle XSLT via <!DOCTYPE ... <!ENTITY ... produira toujours un résultat conforme à votre xsl:output paramètres.

Il peut alors être judicieux d'utiliser un résolveur d'entités local pour empêcher le moteur XSLT de récupérer les définitions d'entités de caractères sur Internet.Les utilisateurs JAXP ou Xalan-J explicites peuvent avoir besoin d'un correctif pour que Xalan-J puisse utiliser correctement le résolveur.Voir mon blog XSLT, entités, Java, Xalan... pour le téléchargement des correctifs et les commentaires.

une autre possibilité d'utiliser des entités HTML depuis xslt est la suivante :

<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>

XSLT ne gère par défaut que les cinq entités de base : lt, gt, apos, quot, et amp.Tous les autres doivent être définis comme @Aku mentionne.

celui-ci renvoie un XsltParseErreur

Oui, et la raison en est que &nbsp; n'est pas une entité prédéfinie en XML ou XSLT comme c'est le cas en HTML.

Vous pouvez simplement utiliser le caractère Unicode qui &nbsp; signifie : &#160;

Maintenant qu'Unicode existe, il est généralement contre-productif d'utiliser des entités de caractères nommées.Je recommanderais d'utiliser le caractère Unicode pour un espace insécable au lieu d'une entité, juste pour cette raison.Alternativement, vous pouvez utiliser l'entité &#160;, au lieu de l'entité nommée.L'utilisation d'entités nommées rend votre XML dépendant d'une DTD en ligne ou externe.

J'ai trouvé que toutes ces solutions produisaient un caractère  dans l'espace vide.

En utilisant <xsl:text> </xsl:text> résolu le problème pour moi ;mais <xsl:text>#x20;</xsl:text> pourrait fonctionner aussi.

Merci pour vos informations.J'ai écrit un court article de blog basé sur ce qui a fonctionné pour moi lorsque j'effectuais une transformation XSLT dans un modèle du CMS Web dynamique.

L'article du blog est ici : Comment ajouter des entités aux modèles XSLT.

/Sten Hougaard

Il faut utiliser l'entité #x160 ;

Je n'ai pas eu de chance avec l'approche DOCTYPE d'Aku.

Ce qui a fonctionné pour moi dans les transformations MSXML sur un serveur Windows 2003, c'est

    <xsl:text disable-output-escaping="yes">&amp;#160;</xsl:text>

Une sorte d'hybride de ce qui précède.Merci aux contributeurs de Stackoverflow !

Un espace entre les balises de texte devrait suffire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top