Замена строк URL в документе XML с помощью XSLT - PullRequest
0 голосов
/ 02 декабря 2009

У меня проблемы с использованием библиотеки функций 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 .

Буду очень признателен за любые предложения, если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

1 Ответ

2 голосов
/ 02 декабря 2009

ОК, translate() не работает так, как вы думаете.

translate() принимает три параметра и заменяет значения первого параметра символ на символ , а не на всю строку.

Вам необходимо использовать один из более открытых шаблонов замены, например этот .

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