xsl transform:Ampersand URL参数的问题

时间:2010-05-25 21:04:14

标签: xslt

我在使用URL中的参数转换XSL时遇到问题。我不能再改变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>

网址已转换:

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

预期的网址:

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

我该如何解决这个问题?输出(oOutput.ToString())正在电子邮件模板中使用,因此它将从字面上转换URL。当您单击此请求(当然使用正确的服务器名称)时,将抛出403(禁止访问)错误。

2 个答案:

答案 0 :(得分:1)

你得到的实际上是你想要的。 &符号必须以HTML格式转义,无论它出现在何处。所以这个

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

acutally 有效的HTML,而这个

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

不是(在validator中查看)。您收到的错误必须来自其他地方。

答案 1 :(得分:1)

问题不在于&符号,而是id周围的单引号。如果他们必须在场,则必须进行网址编码。

所以(假设id周围不需要引号)这应该有效:

  <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>