У меня проблемы с использованием библиотеки функций XSLT 1.0 (поскольку .NET / Visual Studio не поддерживает 2.0), заменой строк атрибутов с использованием XSLT в моем XML-документе.
Атрибуты содержат строки URL, но как только URL считываются с помощью функции translate (), все искажается и выдается беспорядок. Скорее всего, это связано с кодированием строк, которые он читает и пытается выписать. У кого-нибудь есть предложения по лучшему способу чтения / вывода строк, чтобы URL не искажались?
Немного предыстории вопроса. Я создаю динамический элемент управления ASP.Net меню и заполняю его из XMLDataSource. NavigateUrlField имеет значение «Url», а в XML поле Url содержит строки, которые выглядят следующим образом:
URL = "% PLACEHOLDER1% / реж / dir2 / page.aspx"
OR
URL = "% PLACEHOLDER2% / реж / dir2 / page.aspx"
Я использую свойство XmlDataSource TransformFile, для которого установлено значение мой XSLT, и обработчик события OnTransforming для передачи параметров в файл XSLT.
Что я хочу сделать, это заменить текст% PLACEHOLDER1% "и"% PLACEHOLDER2 "через XSLT, чтобы они фактически образовывали разные URL-адреса при привязке к элементу управления ASP.Net Menu.
Это полезно для меня, потому что существуют разные домены и разные сайты (локальные / 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, но если бы я мог заставить это работать, я бы создал второй Param в XSLT и передал бы его из кода, чтобы заменить другие PLACEHOLDER в моем XML .
Буду очень признателен за любые предложения, если вам нужна дополнительная информация, пожалуйста, дайте мне знать!