Comment insérer & nbsp; en XSLT


207

Comment insérer

 

Dans une feuille de style XSLT, je reçois toujours cette erreur:

Erreur d'analyse XML: entité non définie

Essentiellement, je veux un caractère d'espace insécable dans le modèle XSLT.


2
Vous pouvez également utiliser & # xA0; idem pour & # 160; regardez ici stackoverflow.com/questions/7511214/…
user3766111

Réponses:


337

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.


3
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.
Abel

Le lien Top Ten Java and XSLT Tips est vraiment utile.
LCJ

<xsl: text> & # 160; </ xsl: text> il sépare les deux champs
Manash Ranjan Dakua

1
Le lien a pourri.
GSerg

37

&#160;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.

<xsl:text> </xsl:text>

3
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).
Abel

25

On peut aussi faire cela:

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

2
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 &nbsp;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).
Abel

21

Utilisez ceci

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

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.)


1
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):

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

Vous pouvez également ajouter plus d'entités telles que Ntilde, Aacute, etc.


5

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:

<!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>&amp; &nbsp; &ndash;</xsl:text>

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 &nbsp;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.


1
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 ...
Sergey Ushakov

Oui, donc pour référence, pour les dotnetters: méthode abstraite ResolveEntity pour les entités et XmlResolver pour charger les ressources externes , qui sont les équivalents .NET pour ces méthodes Java .
Abel

2

Lorsque vous utilisez ce qui suit (sans disable-output-escaping!), Vous obtiendrez un seul espace insécable:

<xsl:text>&#160;</xsl:text>


4
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 "&nbsp;"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 "&#160;"est un remplacement parfait que "&nbsp;"vous devriez utiliser.

Exemple:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>

0

vous pouvez aussi utiliser:

<xsl:value-of select="'&amp;nbsp'"/>

rappelez-vous l'ampli après le & ou vous obtiendrez un message d'erreur


Cela affichera &amp;nbsp;(en supposant que vous vouliez que le point-virgule soit là), qui sera rendu sous la forme &nbsp;, 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.

<br/>

J'ai un scénario similaire, et cela semble fonctionner pour obtenir le rendu des cellules du tableau.
Richard Moore

0

Essayez d'utiliser

<xsl:text>&#160;</xsl:text>

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 " &nbsp;".


0

Bien que la réponse ait déjà été fournie par @brabster et d'autres.
Je pense qu'une solution plus réutilisable serait:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.