2010-05-18 4 views
10

Je suis totalement novice dans l'utilisation de XSL, donc s'il y a des informations que je néglige d'inclure, faites le moi savoir.Chaîne XSLT avec des entités HTML - Comment puis-je obtenir le rendu en HTML?

J'ai une chaîne dans mon fichier XSLT que je peux afficher comme ceci:

<xsl:value-of select="@Description/> 

et il apparaît, rendu dans un navigateur comme:

<div>I can't do anything about the html entities existing in the text.</div> <div>This includes quotes, like &quot;Hello World&quot; and sometimes whitespaces.&nbsp;</div> 

Que puis-je faire pour obtenir cette chaîne rendue comme html, de sorte que <div></div> résultats dans newlines, &quot; me donne ", et &nbsp; me donne un espace?

Je pourrais élaborer sur les choses que j'ai déjà essayé qui n'ont pas fonctionné, mais je ne sais pas si c'est pertinent.

+0

Bonne question (+1). Voir ma réponse, expliquant pourquoi ce n'est pas si important, comment cela se fait dans l'esprit de XSLT dans XSLT 2.0 et pourquoi utiliser DOE (Disable Output Escaping) n'est pas recommandé. –

Répondre

15

Je pense que vous voulez définir l'attribut suivant comme si:

<xsl:value-of select="@Description" disable-output-escaping="yes"/> 
+0

Aha, merci! Je faisais des choses comme trouver un template 'string-replace' et l'appeler encore et encore, une fois pour chaque entité html. – Kache

+0

Ce 'disable-output-escaping' ne fonctionne tout simplement pas pour moi. Voir [ma question] (http://stackoverflow.com/q/25508777/356815) – basZero

3

Pourquoi avez-vous besoin d'avoir des entités sortie? Pour le navigateur &nbsp; est le même que &#xA0; - dans les deux cas, il affichera un espace insécable.

Il existe une fonctionnalité dans XSLT 2.0 appelée character-maps, qui fournit cette fonctionnalité, si nécessaire. C'est une pratique recommandée XSLT d'essayer de ne pas utiliser DOE, sauf si absolument nécessaire.

En outre, DOE n'est pas une fonctionnalité obligatoire de XSLT et certains processeurs XSLT peuvent ne pas l'implémenter. Cela signifie qu'une application XSLT utilisant DOE n'est généralement pas portable sur différents processeurs XSLT.

+0

Les mappages de caractères sont-ils appliqués dans tout le document? L'exemple de la page a montré qu'il n'était pas enroulé autour d'une sorte d'élément. Aussi, dans mon cas, la chaîne que je reçois est fournie avec les entités html (je n'ai aucun contrôle sur celle-ci). Char-maps peut encore être utilisé? – Kache

+0

@ Kache4: L'entité est seulement dans le document XML (xhtml). L'analyseur le remplace toujours par ' ' et c'est ce que voit le processeur XSLT.Les cartes de caractères ne connaissent rien au document XML - elles sont utilisées lorsque la sortie finale est terminée (sérialisée). Ils peuvent simplement remplacer chaque occurrence de ' ' par ' ' (avec tout ce qui est spécifié pour cette carte de caractères). Les cartes de caractères sont utilisées pour sérialiser l'ensemble de la sortie. –

0

La raison pour laquelle divs en HTML obtenir un endline est complètement différente et liée au CSS boxmodel. La plupart des navigateurs appliquent le style:

div {display:block;} 

Au lieu de l'affichage standard: inline ;. Cependant, ils ne le font que pour divs dans l'espace de noms XHTML. Vous devez générer des divs dans l'espace de noms XHTML pour faciliter cela. Lier l'espace de noms XHTML au préfixe xhtml en haut de votre document comme ceci:

<xsl:stylesheet xmnls:xhtml="http://www.w3.org/1999/xhtml" ... > 

Et puis sortir les divs que <xhtml:div> ... </xhtml:div> la plupart des navigateurs reconnaîtraient la div dans l'espace de noms XHTML (http://www.w3.org/1999/xhtml) et appliquer le bloc style.

Questions connexes