xsl преобразовывают: проблема с параметрами URL Амперсанда

У меня есть проблемы с преобразованием 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&amp;Id='<xsl:value-of disable-output-escaping="yes" select="$app" />'")
      </xsl:attribute>

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

URL преобразовал:

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

Ожидаемый URL:

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

Как я фиксирую это? Вывод (вывод. ToString ()), используется в почтовом шаблоне, таким образом, он берет URL, преобразованный буквально. При нажатии на этот запрос (с корректным именем сервера, конечно), 403 (Запрещенный доступ), ошибка бросается.

1
задан Tomalak 26 May 2010 в 00:16
поделиться

2 ответа

То, что вы получаете, на самом деле то, что вы хотите. Амперсанд должен быть экранирован в HTML, независимо от того, где он встречается. Таким образом, этот

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

фактически является допустимым HTML, а этот

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

- нет (проверьте его в валидаторе ). Ошибка, которую вы получаете, должна быть откуда-то еще.

1
ответ дан 3 September 2019 в 00:18
поделиться

Проблема не в амперсанде, а в одинарных кавычках вокруг идентификатора. Если они должны присутствовать, они должны быть закодированы по 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&amp;Id=</xsl:text>
        <xsl:value-of disable-output-escaping="yes" select="$app" />
        <xsl:text>')</xsl:text>
      </xsl:attribute>
    </div>
  </body>
1
ответ дан 3 September 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: