2016-11-23 3 views
0

Я использую Saxon 8.9 в .NET и хотел бы создать пользовательский элемент. Документы для этой (по общему признанию, старой) версии Saxon довольно неопределенны вокруг этой функции и, по-видимому, предполагают, что ее эфир вообще невозможно или просто не в .NET. Может ли кто-нибудь более подробно понять, возможно ли это?Пользовательские элементы Saxon .NET

UPDATE: После быстрого обновления от Майкла у меня был еще один удар.

  • я создал класс CustomElementFactory, который реализует ExtensionElementFactory
  • В таблице стилей я добавил удлинительный-элемент-префикс и связанный его с пространством имен с Uri окончанием в косой черты, за которым следует FULLNAME из CustomElementFactory
  • Добавлен элемент в мою таблицу стилей.

Это приводит к ошибке XTDE1450 «Неизвестный элемент расширения». Я даже попытался получить старое расширение sql java, преобразованное в dll с помощью IKVM, но оно также не сработало.

Документация для более новых версий обсуждает регистрацию пространства имен в конфигурации процессора, но пространство setExtensionElementNamespace не существует в этой старой версии. Я привязан к 8.9, потому что это версия, которую использует наш продукт, и обновление не реально жизнеспособно.

Я ценю всю помощь.

+0

Я не знаю, почему вопрос был пропущен. Хотелось бы, чтобы было правило, согласно которому люди, голосовавшие или голосующие, должны были оставить комментарий, говорящий почему. –

+0

@Phil, пожалуйста, предоставьте подробную информацию о том, что вы уже пробовали, и более конкретно о проблеме, которую вы испытываете. – benPearce

ответ

0

Отсутствует ссылка здесь, как получить загрузчик классов для решения ExtensionElementFactory.

Полное имя класса ExtensionElementFactory в объявлении пространства имен требует дополнительного префикса «cli». например myBiz.saxon.extensions.customExtensionElementFactory бы на самом деле иметь пространство имен:

xmlns:myBiz="http://myBiz.com/extensions/cli.myBiz.saxon.extensions.customExtensionElementFactory" 

Когда завод находится в другой Реферировано библиотеке вам нужно, чтобы убедиться, что эта Lib была загружена до того, как загрузчик классов пытается решить. Это может быть достигнуто с использованием метода GC.KeepAlive, как описано здесь: IKVM ClassLoader или путем вызова его другими способами. Важно отметить, что просто наличие библиотеки в качестве ссылки недостаточно, она должна быть «загружена», чтобы ClassLoader смог ее разрешить.

В качестве альтернативы вы можете создать собственный ClassLoader (реализующий java.lang.ClassLoader) и зарегистрировать это с процессором:

processor.Implementation.setClassLoader(new customClassLoader()); 
0

«Пользовательский элемент» Я предполагаю, что вы имеете в виду инструкцию расширения XSLT (или элемент расширения, зависящий от той версии используемой спецификации).

API за это не изменился за многие годы, если я правильно помню, но, безусловно, странно делать новые вещи с выпуском, старое, не говоря уже о том, чтобы ожидать помощи.

Я не помню, чтобы когда-либо тестировал, что это можно было достичь на .NET, но это должно быть возможно в теории. Однако вам нужно смириться с тем, что интерфейсы предназначены для Java, а не для C#. Технология IKVM, используемая Saxon для .NET, позволяет не только вызывать Java с C# и наоборот, но также реализовывать интерфейс Java с реализацией C# или переопределять Java-методы с помощью методов C# и даже использовать отладчик Visual Studio на основе смешанного кода. Поэтому я не могу сказать, что это будет легко, но я уверен, что это должно быть возможно.