Nous sommes récemment tombés sur une situation où, dans l'un des nombreux XSL, nous avons cessé de travailler avec cette technique et avons commencé à montrer un personnage étrange. Cependant, si j'utilise la technique CDATA de WaterSoul, cela fonctionne.
@BrianReindel, cela signifie probablement que vous avez utilisé la mauvaise référence d'entité numérique, c'est-à-dire Šau lieu de  celle-ci, qui se résoudra toujours en un espace insécable Unicode.
En utilisant la réponse acceptée, je me suis retrouvé avec un espace de rupture de ligne dans ma sortie XML (au moins c'est à quoi il ressemblait dans l'éditeur XML de VS2010). En utilisant cette réponse, j'obtiens exactement 1 espace seulement.
Mathijs Flietstra du
1
@Matthijs, c'est un espace, pas un espace insécable, ce n'est pas pareil. Si VS ne l'affiche pas correctement, vérifiez votre encodage (VS est parfaitement capable de l'afficher correctement et il devrait être indépendant de l'encodage, il est donc plus probable que vous fassiez quelque chose de mal).
Cela fonctionnera si le processeur prend en chargedisable-output-escaping , ce qui n'est pas nécessaire et il a été déconseillé dans XSLT 2.0 et plus encore dans 3.0. Dans ces versions, vous pouvez atteindre le même effet avec un fonctionnement xsl:character-mapgaranti entre les processeurs. En outre, cela place une entité nommée dans la sortie, qui n'est pas nécessairement la même chose qu'un espace insécable et l'extrémité de réception doit avoir cette entité déclarée (en HTML, c'est généralement implicitement).
Je ne sais pas, mais j'ai testé mon approche et cela fonctionne, donc je ne sais pas à quoi servait le
downvote
2
De plus, la réponse acceptée ne sera pas valable pour tous les analyseurs selon la page liée; juste un
avertissement
1
J'ai déjà donné la raison de mon downvote, mais si je devais downvote cette réponse, alors la raison serait - cela répond à la mauvaise question. L'OP a clairement demandé comment mettre dans un espace incassable, en utilisant xslt et vous avez répondu comment mettre la séquence esperluette-nbsp-point-virgule. Et se quereller au sujet des votes négatifs est également inacceptable. Mais sérieusement, n'avez-vous jamais dit cela à propos de CDATA?
Michael Krelin - hacker le
1
D'accord, jagprinderdeep, je révoque mon downvote, mais en retour s'il vous plaît allez me rendre visite une fois que j'ai frappé l'asile mental. (notez que je ne vous redonne pas le downvote pour cette nouvelle raison). Mais comprenez que vous répondez à la mauvaise question. Je pense que c'était exactement la raison derrière l'autre downvote.
Michael Krelin - hacker le
8
J'ai également rétrogradé car vous ne pouvez pas garantir que le destinataire déclarera & nbsp ;. Si vous travaillez avec xslt + html, alors oui, c'est une façon de le faire, même si c'est un hack. Mais, si vous utilisez xslt pour générer d'autres fichiers xml, cela vous explosera.
Doug
14
Vous voudrez peut-être ajouter la définition de cette entité au début du fichier (sous la déclaration xml):
Il existe également une certaine différence dans le résultat de cette approche par rapport à <xsl:text disable-output-escaping="yes">une. Ce dernier va produire des littéraux de chaîne comme pour tous les types de sortie, même pour <xsl:output method="text">, et cela peut être 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 une sortie cohérente avec vos xsl:outputparamètres.
Et lorsque vous incluez toutes les références de caractères, il peut être judicieux d'utiliser un résolveur d'entité local pour empêcher le moteur XSLT de récupérer les définitions d'entité de caractère sur Internet. Les utilisateurs JAXP ou Xalan-J explicites peuvent avoir besoin d'un correctif pour que Xalan-J utilise correctement le résolveur. Voir mon blog XSLT, entités, Java, Xalan ... pour télécharger le patch et commenter.
Notez que récemment, W3 a commencé à bloquer trop de requêtes vers celles-ci et des liens similaires s'ils provenaient d'un processus automatisé. Placez ce fichier localement ou sur votre serveur et ajustez l'URL en conséquence et ça devrait aller. Autre que cela, +1 et excellente solution pour utiliser des entités nommées HTML.
Abel
Une bonne note, et il existe également une autre raison d'avoir une copie locale du fichier avec les définitions d'entité, sinon le processus XSLT échouera probablement si la connexion Internet n'est pas disponible. Dans le monde Java, il n'est pas nécessaire de pirater les URL, car il est possible d'organiser un EntityResolver , et Apache XML Commons Resolver peut être un bon candidat. D'autres plates-formes de programmation sont susceptibles d'avoir des techniques similaires aussi ...
Vous n'avez pas besoin disable-output-escapingpour ce
Roberts Ian
2
Les feuilles de style XSLT doivent être du XML bien formé. Étant donné qu'il " "ne fait pas partie des cinq entités XML prédéfinies , il ne peut pas être directement inclus dans la feuille de style. Donc, revenir à votre solution " "est un remplacement parfait que " "vous devriez utiliser.
Cela affichera &nbsp;(en supposant que vous vouliez que le point-virgule soit là), qui sera rendu sous la forme , et non sous la forme `` (nb-space).
Abel
0
J'essayais d'afficher des bordures sur une cellule vide dans un tableau HTML. Mon ancienne astuce consistant à utiliser un espace insécable dans les cellules vides ne fonctionnait pas à partir de xslt. J'ai utilisé le saut de ligne avec le même effet. Je mentionne cela juste au cas où la raison pour laquelle vous essayez d'utiliser l'espace insécable était de donner du contenu à une cellule de tableau «vide» afin d'activer les bordures de cellule.
Réponses:
Utilisez
 
plutôt le code d'entité .
est une "référence d'entité de caractère" HTML. Il n'y a pas d'entité nommée pour l'espace insécable en XML, vous utilisez donc le code 
.Wikipedia inclut une liste d'entités XML et HTML , et vous pouvez voir qu'il n'y a que 5 "entités prédéfinies" en XML, mais HTML en a plus de 200. Je vais également pointer vers Créer un espace (& nbsp;) en XSL qui a d'excellentes réponses.
la source
Š
au lieu de 
celle-ci, qui se résoudra toujours en un espace insécable Unicode. 
fonctionne vraiment bien. Cependant, il affichera l'un de ces caractères étranges dans le codage ANSI.<xsl:text>
a fonctionné le mieux pour moi.la source
On peut aussi faire cela:
la source
disable-output-escaping
, ce qui n'est pas nécessaire et il a été déconseillé dans XSLT 2.0 et plus encore dans 3.0. Dans ces versions, vous pouvez atteindre le même effet avec un fonctionnementxsl:character-map
garanti entre les processeurs. En outre, cela place une entité nommée
dans la sortie, qui n'est pas nécessairement la même chose qu'un espace insécable et l'extrémité de réception doit avoir cette entité déclarée (en HTML, c'est généralement implicitement).Utilisez ceci
edit: les downvoters devraient probablement valider que cela fonctionne en premier (c'est le cas, et c'est la solution la plus générale au problème.)
la source
Vous voudrez peut-être ajouter la définition de cette entité au début du fichier (sous la déclaration xml):
Vous pouvez également ajouter plus d'entités telles que Ntilde, Aacute, etc.
la source
En plus de la réponse de victor hugo, il est possible d'obtenir toutes les références de caractères connues dans un fichier XSLT, comme ceci:
Il existe également une certaine différence dans le résultat de cette approche par rapport à
<xsl:text disable-output-escaping="yes">
une. Ce dernier va produire des littéraux de chaîne comme
pour tous les types de sortie, même pour<xsl:output method="text">
, et cela peut être 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 une sortie cohérente avec vosxsl:output
paramètres.Et lorsque vous incluez toutes les références de caractères, il peut être judicieux d'utiliser un résolveur d'entité local pour empêcher le moteur XSLT de récupérer les définitions d'entité de caractère sur Internet. Les utilisateurs JAXP ou Xalan-J explicites peuvent avoir besoin d'un correctif pour que Xalan-J utilise correctement le résolveur. Voir mon blog XSLT, entités, Java, Xalan ... pour télécharger le patch et commenter.
la source
Lorsque vous utilisez ce qui suit (sans
disable-output-escaping
!), Vous obtiendrez un seul espace insécable:<xsl:text> </xsl:text>
la source
disable-output-escaping
pour ceLes feuilles de style XSLT doivent être du XML bien formé. Étant donné qu'il
" "
ne fait pas partie des cinq entités XML prédéfinies , il ne peut pas être directement inclus dans la feuille de style. Donc, revenir à votre solution" "
est un remplacement parfait que" "
vous devriez utiliser.Exemple:
la source
vous pouvez aussi utiliser:
rappelez-vous l'ampli après le & ou vous obtiendrez un message d'erreur
la source
&nbsp;
(en supposant que vous vouliez que le point-virgule soit là), qui sera rendu sous la forme
, et non sous la forme `` (nb-space).J'essayais d'afficher des bordures sur une cellule vide dans un tableau HTML. Mon ancienne astuce consistant à utiliser un espace insécable dans les cellules vides ne fonctionnait pas à partir de xslt. J'ai utilisé le saut de ligne avec le même effet. Je mentionne cela juste au cas où la raison pour laquelle vous essayez d'utiliser l'espace insécable était de donner du contenu à une cellule de tableau «vide» afin d'activer les bordures de cellule.
la source
Essayez d'utiliser
Mais cela dépend du processeur XSLT que vous utilisez: la spécification XSLT ne nécessite pas de processeurs XSLT pour le convertir en "
".la source
Bien que la réponse ait déjà été fournie par @brabster et d'autres.
Je pense qu'une solution plus réutilisable serait:
la source