У меня есть проблемы с преобразованием XSL с параметрами в URL. Я в точке, что я не могу больше изменять код C#, только может внести изменения в xsl файл.
Код 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)
Код 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&Id='<xsl:value-of disable-output-escaping="yes" select="$app" />'")
</xsl:attribute>
</div>
</body>
</html>
URL преобразовал:
https://server/image.gif?a=10&Id='1052391'
Ожидаемый URL:
https://server/image.gif?a=10&Id='1052391'
Как я фиксирую это? Вывод (вывод. ToString ()), используется в почтовом шаблоне, таким образом, он берет URL, преобразованный буквально. При нажатии на этот запрос (с корректным именем сервера, конечно), 403 (Запрещенный доступ), ошибка бросается.
То, что вы получаете, на самом деле то, что вы хотите. Амперсанд должен быть экранирован в HTML, независимо от того, где он встречается. Таким образом, этот
<div
id="homeImage"
style="background-image:url("https://server/image.gif?a=10&Id='1052391'")"
></div>
фактически является допустимым HTML, а этот
<div
id="homeImage"
style="background-image:url("https://server/image.gif?a=10&Id='1052391'")"
></div>
- нет (проверьте его в валидаторе ). Ошибка, которую вы получаете, должна быть откуда-то еще.
Проблема не в амперсанде, а в одинарных кавычках вокруг идентификатора. Если они должны присутствовать, они должны быть закодированы по URL-адресу.
Итак (при условии, что не нужны кавычки вокруг идентификатора), это должно работать:
<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&Id=</xsl:text>
<xsl:value-of disable-output-escaping="yes" select="$app" />
<xsl:text>')</xsl:text>
</xsl:attribute>
</div>
</body>