xsl transform: проблема с параметрами URL амперсанда - PullRequest
1 голос
/ 26 мая 2010

У меня проблемы с преобразованием 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'

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

Ответы [ 2 ]

1 голос
/ 26 мая 2010

Проблема не в амперсанде, а в одинарных кавычках вокруг идентификатора. Если они должны присутствовать, они должны быть закодированы в 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 голос
/ 26 мая 2010

То, что вы получаете, на самом деле то, что вы хотите.Амперсанд должен экранироваться в 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>

- нет (отметьте его в валидаторе ).Полученная вами ошибка должна быть откуда-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...