使用XSLT替换XML文档中的URL字符串

时间:2009-12-02 18:53:45

标签: asp.net xml xslt

我在使用XSLT 1.0函数库时遇到问题(因为.NET / Visual Studio不支持2.0),在我的XML文档中使用XSLT替换属性字符串。

这些属性包含URL字符串,但只要通过translate()函数读入URL,一切都会出现乱码并导致混乱。这很可能是由于它正在读取的字符串的编码并试图写出来。有没有人建议更好的方法来读取/输出字符串,以便URL不会出现乱码?

关于这个问题的背景很少。我正在创建一个动态ASP.Net菜单控件,并从XMLDataSource填充它。 NavigateUrlField设置为“Url”,在XML中,Url字段包含如下所示的字符串:

URL = “%PLACEHOLDER1%/目录/ DIR2 / page.aspx”
OR
URL = “%PLACEHOLDER2%/目录/ DIR2 / page.aspx”

我正在使用XmlDataSource TransformFile属性,设置为我的XSLT,以及OnTransforming事件处理程序将参数传递给XSLT文件。

我想要做的是通过XSLT替换文本%PLACEHOLDER1%和“%PLACEHOLDER2”,以便它们在绑定到ASP.Net菜单控件时实际形成不同的URL。

这对我很有用,因为有不同的域和不同的站点(本地/ dev / production / etc),域URL也不同。通过这种方式,我可以将不同的参数传递给XSLT,具体取决于我正在构建/测试的版本。

这是XSLT代码:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8"/>

  <xsl:param name="targetString"/>
  <xsl:param name="replacementString"/>

  <xsl:template match="@Url">
    <xsl:attribute name="Url">
      <xsl:choose>
        <xsl:when test="contains(., $targetString)">
          <xsl:value-of select="translate(.,$targetString,$replacementString)" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="." />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="@*|*">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

这是调用XSLT的事件处理程序中的代码:

protected void TransformEventHandler(object sender, EventArgs e)
{
    // Create an XsltArgumentList.
    XsltArgumentList xslArg = new XsltArgumentList();
    xslArg.AddParam("targetString", "", "%PLACEHOLDER1%");
    xslArg.AddParam("replacementString", "", "http://www.testdomain.com");

    ((XmlDataSource)sender).TransformArgumentList = xslArg;
}

XML文件如下所示:

<FooterNAV>
  <Menu LinkText="Link 1" Url="%PLACEHOLDER1%/dir/dir2/somepage.aspx" Description="" />
  <Menu LinkText="Link 2" Description="" Url="%PLACEHOLDER1%/dir/dir2/someotherpage.aspx" />
</FooterNAV>

在这些示例中,我只是尝试替换PLACEHOLDER1文本,但如果我能够实现这一点,我将在XSLT中创建第二个Param并从代码隐藏中传递它以替换我的XML中的其他PLACEHOLDERS

我真的很感激任何建议,如果您需要任何进一步的信息,请告诉我!

1 个答案:

答案 0 :(得分:2)

好的,translate()不像您认为的那样有效。

translate()接受三个参数,并从第一个参数逐个字符替换值,而不是整个字符串。

您需要使用其中一个更开放的替换模板,例如this one