Реализация exslt.dynamic.evaluate в c # (XslCompiledTransform) - PullRequest
0 голосов
/ 16 марта 2010

У меня есть таблица стилей, в которой используется модуль exslt: dynamic, а точнее - функция оценки. Я знаю, что XslCompiledTransform из .NET 2.0 не реализует этот модуль (так же, как ExslTransform из Mvp.Xml).

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 17 марта 2010

Вот мой последний объект расширения для использования функции оценки одного параметра из exslt:

public class DynamicExtension
{
    XPathNavigator _context;
    IXmlNamespaceResolver _namespaceResolver;

    public DynamicExtension(XPathNavigator p_context, IXmlNamespaceResolver p_namespaceResolver)
    {
        _context = p_context;
        _namespaceResolver= p_namespaceResolver;
    }

    public object evaluate(string p_expression)
    {
        return _context.Evaluate(p_expression, _namespaceResolver);
    }
}

IXmlNameSpaceResolver, переданный конструктору, является экземпляром XmlNamespaceManager. Мне это нужно, так как узлы в моем xml имеют префикс пространства имен. Важно, чтобы регистр метода оценки совпадал с регистром, используемым в xsl. Наконец, интерфейс IXPathNavigable не имеет функции Evaluate, мне пришлось передать объект XPathNavigator (полученный из моего метода XmlDocument.CreateNavigator).

1 голос
/ 16 марта 2010

Mvp.Xml включает аналогичную функцию расширения dyn2: динамический .

объект dyn2: оценка (набор узлов, строка, строка?)

Dyn2: функция оценки оценивает строка как выражение XPath и возвращает результирующее значение, которое может быть логическим, число, строка, набор узлов, фрагмент дерева результатов или внешний объект.

Первый аргумент набора узлов обеспечивает узел контекста (первый узел в переданный набор узлов), такой, что выбор пути оцениваются относительно этого. Второй строковый аргумент - XPath выражение для оценки. В третьих необязательный строковый аргумент привязки пространства имен, которые будут использоваться для разрешить префиксы пространства имен в XPath выражение. Пространства имен определяется в стиле XML, как пробел разделенный список пространства имен атрибуты объявления.

Все префиксы пространства имен, которые находятся в область для узла контекста (или его родительский узел, если контекстный узел не элемент узла) можно ссылаться в оценил выражение XPath. Заметка хотя это полагаясь на пространство имен префиксы, определенные в исходном XML очень ненадежный Мы рекомендуем пользователям явно определять привязки пространства имен вместо этого в третьем аргументе.

Если набор узлов прошел первым аргумент пуст (без узла контекста) или строка выражения передана как Второй аргумент - неверный XPath выражение (включая пустое строка), эта функция возвращает пустой строки. Искаженное пространство имен объявления в третьем аргументе игнорироваться.

Обратите внимание, что эта функция более ограничено, чем dyn EXSLT: valu () функция. Более формально:

  • Положение контекста и информация о размере контекста недоступны.
  • Нет привязок переменных - эта функция не может вычислять выражения XPath, которые содержат ссылки на переменные!
  • Нет пользовательских функций расширения - доступны только основные функции XPath и все функции расширения, поддерживаемые EXSLT.NET.
  • Нет текущего узла, поэтому выражение не может содержать вызовы функции current ().
  • Информация об определении ключа недоступна, поэтому выражение не может содержать вызовы функции key ().
  • Доступны определения пользовательских десятичных форматов, поэтому выражение не может содержать Функция fomat-number () вызывает обратитесь к определение.

Не существует версии с одним параметром для этой функции расширения, потому что у нее не было бы контекста для оценки выражения.

Это следующее расширение является версией оценки с одним параметром. Контекст оценки фиксирован.

public class MyExtension
{
    IXPathNavigable context;
    public MyExtension( IXPathNavigable context )
    {
        this.context = context;
    }
    public object Evaluate( string expression )
    {
        return context.CreateNavigator().Evaluate( expression );
    }
}

XsltArgumentList args = new XsltArgumentList();
args.AddExtensionObject("my-ext", new MyExtension(doc));

xslt.Transform( doc, args output );
...