2010-05-25 6 views
1

Je rencontre des problèmes avec la transformation de XSL avec des paramètres dans une URL. Je suis à un point que je ne peux plus changer le code C#, seulement peut apporter des modifications au fichier xsl.Transformation xsl: problème avec les paramètres d'URL Ampersand

code C#:

string xml = "<APPLDATA><APPID>1052391</APPID></APPLDATA>"; 

XmlDocument oXml = new XmlDocument(); 
oXml.LoadXml(xml); 

XslTransform oXslTransform = new XslTransform(); 
oXslTransform.Load(@"C:\Projects\Win\ConsoleApps\XslTransformTest\S15033.xsl"); 

StringWriter oOutput = new StringWriter(); 
oXslTransform.Transform(oXml, null, oOutput) 

Code XSL:

<body> 
    <xsl:variable name="app"> 
     <xsl:value-of select="normalize-space(APPLDATA/APPID)" /> 
    </xsl:variable> 
    <div id="homeImage" > 
     <xsl:attribute name="style"> 
     background-image:url("https://server/image.gif?a=10&amp;Id='<xsl:value-of disable-output-escaping="yes" select="$app" />'") 
     </xsl:attribute> 

    </div> 
    </body> 
</html> 

URL transformé:

https://server/image.gif?a=10&amp;Id='1052391' 

URL Expected:

https://server/image.gif?a=10&Id='1052391' 

Comment puis-je résoudre ce problème? La sortie (oOutput.ToString()) est utilisée dans un modèle d'e-mail afin de prendre l'URL transformée littéralement. Lorsque vous cliquez sur cette requête (avec le nom du serveur correct bien sûr), l'erreur 403 (Accès interdit) est lancée.

Répondre

1

Ce que vous obtenez est réellement ce que vous voulez. L'esperluette doit être être échappée en HTML, peu importe où elle se produit. Donc, ce

<div 
    id="homeImage" 
    style="background-image:url(&quot;https://server/image.gif?a=10&amp;Id='1052391'&quot;)" 
></div> 

acutally est HTML valide, alors que ce

<div 
    id="homeImage" 
    style="background-image:url(&quot;https://server/image.gif?a=10&Id='1052391'&quot;)" 
></div> 

n'est pas (vérifier dans le validator). L'erreur que vous recevez doit provenir d'ailleurs.

1

Le problème n'est pas l'esperluette mais les guillemets simples autour de l'ID. Si elles doivent être présentes, elles doivent être encodées en url.

donc (en supposant sans guillemets sont nécessaires autour de l'identifiant) cela devrait fonctionner:

<body> 
    <xsl:variable name="app"> 
     <xsl:value-of select="normalize-space(APPLDATA/APPID)" /> 
    </xsl:variable> 
    <div id="homeImage" > 
     <xsl:attribute name="style"> 
     <xsl:text disable-output-escaping="yes">background-image:url('https://server/image.gif?a=10&amp;Id=</xsl:text> 
     <xsl:value-of disable-output-escaping="yes" select="$app" /> 
     <xsl:text>')</xsl:text> 
     </xsl:attribute> 
    </div> 
    </body> 
Questions connexes