我在使用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
我真的很感激任何建议,如果您需要任何进一步的信息,请告诉我!
答案 0 :(得分:2)