2014-09-10 3 views
1

Я должен был первоначально опубликовать свой вопрос, указав, что наш код использует встроенную функцию расширения саксона - saxon: parse ($ xml), которая вернула корневой элемент/узел xml. Однако в Saxon-HE это расширение больше не доступно, поэтому я пытаюсь написать интегрированное расширение, которое анализирует строку xml в документе и возвращает корневой элемент.Встроенные функции расширения Saxon-HE

Я использую Saxon-HE 9.5.1.6 - Я пытаюсь написать интегрированную функцию расширения, которая возвращает ROOT-узел документа. Функция получает строку xml - создает документ и должна вернуть корневой узел в xslt, чтобы затем использовать xpath для поиска определенного элемента. Метод call() класса/типов ExtensionFunctionCall возвращает тип Sequence - как мне вернуть NodeSequence или NodeType? Как создать NodeSequence из моего документа?

Я могу выполнить отладку и подтвердить, что функция получает правильный xml - анализирует это в документе, но до сих пор я не могу определить, как построить NodeSequence с моим RootElement.

У меня есть другие встроенные функции расширения, которые возвращают StringValue, и они отлично работают, но я не могу получить доступ к доступным классам методов, чтобы вернуть ничего, кроме простых (numerica/alpha/item) типов из ExtensionFunctionCall

спасибо.

+0

Можете ли вы показать нам (соответствующая часть) кода? – LarsH

+0

частный статический класс SurveyParseCall расширяет ExtensionFunctionCall { – MichaelT

+0

частный статический класс SurveyParseCall расширяет ExtensionFunctionCall { @Override общественности Последовательность вызова (XPathContext контекст, Sequence [] аргументы) броски XPathException { последовательность сл = аргументы [0]; Строка xml = ((StringValue) seq.head()). GetStringValue(); DocumentBuilderFactory = DocumentBuilderFactory.newInstance(); // Следующее идет в попытке catch - опуская это здесь DocumentBuilder builder = factory.newDocumentBuilder; Документ document = builder.parse (новый InputSource (новый StringReader (xml))); // здесь мне нужно вернуть document.getDocumentElement(); – MichaelT

ответ

4

Класс DocumentInfo реализует Sequence, поэтому, если вы вернете DocumentInfo, который будет удовлетворять интерфейсу. Вы можете построить DocumentInfo с помощью

context.getConfiguration().buildDocument() 

Если вы хотите построить свой документ с помощью какой-нибудь внешнего объекта модели, таких как DOM или JDOM2, вам нужно будет взять корневой узел этого внешнего документа и завернуть его в надлежащем виде Saxon DocumentWrapper, чтобы превратить его в DocumentInfo.

+0

СПАСИБО! Это отлично работает: Источник source = новый StreamSource (новый StringReader (myXMLparam)); DocumentInfo docInfo = context.getConfiguration().buildDocument (источник); return docInfo; Мой вопрос: я пробовал вчера много дня, чтобы узнать, как это сделать, глядя в классы, на документацию - есть ли где-нибудь в документации, где это описано? ЕЩЕ РАЗ СПАСИБО! – MichaelT

+0

Проблема с саксонской документацией заключается в том, что ее так много, очень сложно найти бит, который вы ищете. Разумеется, мы могли бы сделать с лучшим руководством для написания интегрированных функций расширения: я боюсь, что версия 9.5 даже не обновлена. Лучше всего привыкнуть к тому, чтобы найти свой путь вокруг Джавадока; или использование IDE может помочь вам рассказать вам, какие существуют подклассы класса, такие как Sequence. –

2

Для тех, кто читает - после этого я смог получить эту работу с помощью Майкла Кея - мое решение заключается в следующем:

Source source = new StreamSource(new StringReader(myXMLparam)); 
DocumentInfo docInfo = context.getConfiguration().buildDocument(source); 
return docInfo; 
+0

Спасибо, что разместили образец кода. – LarsH

Смежные вопросы