2010-11-30 35 views
2

J'ai quelques XML exemple:HTML à l'intérieur XML CDATA converti avec des supports <et>

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample> 

J'utilise ASP pour sortir ce code XML en utilisant une feuille de style comme ceci:

Set xmlHttp = Server.CreateObject("Microsoft.XMLHTTP") 
xmlHttp.open "GET", URLxml, false 
xmlHttp.send() 

Set xslHttp = Server.CreateObject("Microsoft.XMLHTTP") 
xslHttp.open "GET", xXsl, false 
xslHttp.send() 

Set xmlDoc = Server.CreateObject("MICROSOFT.XMLDOM") 
Set xslDoc = Server.CreateObject("MICROSOFT.XMLDOM") 
xmlDoc.async = false 
xslDoc.async = false 
xmlDoc.Load xmlHttp.responseXML 
xslDoc.Load xslHttp.responseXML 

Response.Write xmlDoc.transformNode(xslDoc) 

Cependant , une fois que cela est écrit, la sortie HTML apparaît comme suit:

Line 1&lt;br /&gt;Line 2&lt;br /&gt;Line 3 

Je peux voir t hat ASP convertit les crochets dans le code, mais je ne sais pas pourquoi. Des pensées?

+0

Bonne question, +1. En plus de la bonne explication de @Alejandro, voir ma réponse décrivant la meilleure solution possible au problème. –

+0

+ 1 question est claire et cherche une réponse définitive - que noté, l'affichage du document XSL aiderait. – orangepips

+0

La partie du fichier XSL qui génère ces données est un simple . –

Répondre

2

J'ai quelques XML exemple:

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample> 

Ceci est un élément sample avec un enfant de nœud de texte . Supposons que vous appliquiez une transformation d'identité.

Alors le résultat sera:

<sample>Line 1&lt;br /&gt;Line 2&lt;br /&gt;Line 3&lt;br /&gt;</sample> 

Pourquoi? Les nœuds de texte et les valeurs d'attribut ayant le caractère spécial &, < et > s'échappent en tant qu'entités de caractères.

EDIT: Bien sûr, vous pouvez utiliser DOE ... Mais, outre que c'est une fonction optionnelle, le résultat sera un nœud de texte, peu importe ce que (sans les entités de caractère encode). Vous aurez besoin d'autres fase de l'analyseur (cela peut être utile lors de la sortie et encoder le fragment HTML dans un document (X) HTML comme dans les flux, avec le risque de sortie mal formée ...).

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="sample"> 
     <p> 
      <xsl:value-of select="." disable-output-escaping="yes"/> 
     </p> 
    </xsl:template> 
</xsl:stylesheet> 

sortie:

<p>Line 1<br />Line 2<br />Line 3<br /></p> 

rendre aussi (balisage réel):

Ligne 1
Ligne 2
Ligne 3

+0

Mais être dans une instruction CDATA ne devrait pas être sortie comme écrite? N'est-ce pas le but d'un CDATA, ignorer fondamentalement tous les caractères spéciaux en son sein? –

+0

Le but d'une instruction CDATA est d'offrir un autre moyen de sérialiser les données. Blocs de code ']]>' et ' </>' sont * sémantiquement * identiques. Dans les deux cas, il existe un élément d'échantillon dont le contenu est «
» en tant que chaîne de texte, et non en tant qu'élément. La sortie HTML est la sérialisation HTML de vos données et même en HTML vous devez échapper les caractères '<'. – jasso

+0

@Steve K .: Section CDATA dire: * "Ne pas analyser cela, le traiter comme du texte" * –

1

Outre @ L'explication d'Alejandro, elle e est la meilleure solution possible:

Ne mettez jamais de balisage dans un noeud de texte (CDATA).

Au lieu de:

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample> 

toujours créer:

<sample>Line 1<br />Line 2<br />Line 3<br /></sample> 

Rappelez-vous: Mettre le balisage intérieur de CDATA est la perdre.

1

Pensez que c'est la transformation XSL qui vous cause des problèmes.Vous devriez être en mesure de modifier votre document .xsl pour corriger cela comme tel:

<xsl:template match="."> 
    <xsl:value-of select="." disable-output-escaping="yes" /> 
    <!-- ... other XSL business here ... --> 
</xsl:template> 

Je vole de this page about disable output escaping. Pour l'enregistrement, je déteste XML/XSL - une solution à la recherche d'un problème. D'une manière générale, si vous avez besoin de balisage, j'ai trouvé que XML/XSL ne pose que des problèmes, car souvent vous voulez traiter des fragments de balisage, qui sont souvent des XML non valides, donc vous enveloppez CDATA et ensuite vous hésitez expérimenter.

Mise à jour

OK, ce qui précède ne fonctionne pas. Bien sûr, je ne savais pas à quoi ressemblait XSL jusqu'à ce que le commentaire sur la question a été ajouté. Ce qui suit fonctionne (idée de this forum thread):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:template match="."> 
     <xsl:value-of select="sample" /> 
    </xsl:template> 
</xsl:stylesheet> 

Key est le <xsl:output method="text" />.

De même, pour le vote baissier, commentez pourquoi.

+0

@orangepics: Oui! Régulièrement Traiter les données non analysées comme des données analysables ne fait pas partie de votre problème ... –

+0

@Alejandro: hein? – orangepips

+0

L'ajout du paramètre disable-out-escaping n'a pas abouti. Il semble que ASP est le coupable qui est en train de le changer sur la sortie. J'ai également constaté qu'il change et est à & ... –