Прерванная функция расширения .net 4 xslt

2

Я занимаюсь обновлением веб-приложения asp.net v3.5. к v4, и я столкнулся с некоторыми проблемами с преобразованиями XSLT, которые я использую для объектов XmlDataSource.

Часть файла XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:HttpUtility="ds:HttpUtility">
  <xsl:output method="xml" indent="yes" encoding="utf-8"/>
  <xsl:template match="/Menus">
    <MenuItems>
      <xsl:call-template name="MenuListing" />
    </MenuItems>
  </xsl:template>

  <xsl:template name="MenuListing">
    <xsl:apply-templates select="Menu" />
  </xsl:template>

  <xsl:template match="Menu">
      <MenuItem>
        <xsl:attribute name="Text">
          <xsl:value-of select="HttpUtility:HtmlEncode(MenuTitle)"/>
        </xsl:attribute>
        <xsl:attribute name="ToolTip">
          <xsl:value-of select="MenuTitle"/>
        </xsl:attribute>
      </MenuItem>
  </xsl:template>
</xsl:stylesheet>

Проблема, кажется, в строке

<xsl:value-of select="HttpUtility:HtmlEncode(MenuTitle)"/>

Удалив это и заменив его обычным текстом, он будет работать. Способ установки источника данных XML:

    xmlDataSource.TransformArgumentList.AddExtensionObject("ds:HttpUtility", new System.Web.HttpUtility());
    xmlDataSource.Data = Cache.FetchPageMenu();

Я искал страницы Microsoft для любых изменений в v4, но не могу их найти. Все это отлично работало в версии 3.5 (и до версии 2). Не получая никаких ошибок, данные просто не отображаются.

  • 0
    И какое значение строки MenuTitle вы хотите закодировать?
Теги:
xslt
.net-4.0

1 ответ

5

Проблема заключается в том, что .NET 4.0 вводит дополнительную перегрузку для HttpUtility.HtmlEncode. До .NET 3.5 произошли следующие перегрузки:

public static string HtmlEncode(string s);
public static void HtmlEncode(string s, TextWriter output);

.NET 4.0 также имеет следующий метод:

public static string HtmlEncode(object value);

В результате получается XslTransformException:

(вызов неоднозначного метода. Объект расширения "ds: HttpUtility" содержит несколько методов "HtmlEncode", которые имеют 1 параметр (ы).

Вероятно, вы не видите исключение, потому что оно поймано где-то и не сообщается немедленно.

Использование классов .NET Framework в качестве объектов расширения является хрупкой вещью, поскольку новая версия Framework может нарушить вашу трансформацию.

Исправить было бы создание настраиваемого класса-оболочки и использование его как объекта расширения. Этот класс обертки может не иметь перегрузок с одинаковым количеством параметров:

class ExtensionObject
{
    public string HtmlEncode(string input)
    {
        return System.Web.HttpUtility.HtmlEncode(input);
    }
}

//...
XsltArgumentList arguments = new XsltArgumentList();
arguments.AddExtensionObject("my:HttpUtility", new ExtensionObject());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню