Как преобразовать вложенный XML сложный элемент в Saxon.Sequence в Java? - PullRequest
0 голосов
/ 13 февраля 2019

Я новичок в саксонии, использующей его для обработки существующих xqueries.Я могу выполнить простой xquery с примитивными типами (простые типы) из класса Java, как показано ниже:

Xquery:
declare function xf:addNumberss($int1 as xs:int,
$int2 as xs:int)
as xs:int {
    <value>{data($int1)+data($int2)}</value>

};

Java:
final Sequence[] arglist = new Sequence[2];
    arglist[0] = new Int64Value(10);
    arglist[1] = new Int64Value(10);
        arglist[0] = new Int64Value(request.getNo1());
        arglist[1] = new Int64Value(request.getNo2());
        Sequence result = null;
        try {
            result = fn1.call(arglist, controller);

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

Ex: Xquery

declare function xf:addNumbersByElements($addNumbers1 as element(ns0:addNumbers))
as element(ns0:addNumbersResponse) {
    <ns0:addNumbersResponse>
        <ns0:response>
            <ns0:result>{ data($addNumbers1/ns0:request/ns0:no1) + data($addNumbers1/ns0:request/ns0:no2) }</ns0:result>
        </ns0:response>
    </ns0:addNumbersResponse>

Java:
final Sequence[] arglist = new Sequence[1];
    arglist[0] = (Sequence)addNumType;

Невозможно преобразовать сложный тип AdNumType в последовательность Исключение: java.lang.ClassCastException: com.xq.AddNumbersType несовместимо с net.sf.saxon.om.Sequence

Может кто-нибудь помочь, пожалуйста, как преобразовать сложный тип для ввода xquery в Saxon.Также, пожалуйста, предложите любые учебные ссылки, доступные кроме справочного руководства API.

Спасибо

1 Ответ

0 голосов
/ 13 февраля 2019

Я бы рекомендовал использовать интерфейс s9api (классы, такие как XdmValue, XdmAtomicValue, XdmNode), а не интерфейсы более низкого уровня (классы, такие как NodeInfo, Int64Value, Sequence), потому чтонизкоуровневые интерфейсы создают слишком большую внутреннюю сложность и не настолько стабильны между выпусками.

На уровне s9api вы можете скомпилировать запрос, используя XQueryCompiler.compile(), чтобы вернуть XQueryExecutable;вызовите load() для этого, чтобы получить XQueryEvaluator, а затем вызовите callFunction() для этого, чтобы вызвать определенную функцию XQuery.Метод callFunction() принимает аргументы и возвращает результаты в виде XdmValue экземпляров.Если запрос возвращает узел, он будет в форме экземпляра XdmNode, и вы можете выполнить дополнительный запрос для этого XdmNode, установив его в качестве элемента контекста для другого запроса, используя XQueryEvaluator.setContextItem().

Если вы хотите использовать интерфейс более низкого уровня, Sequence - это интерфейс, и вам нужно будет выбрать конкретную реализацию.Для последовательности, которая является единственным узлом, подинтерфейс NodeInfo подходит;но вы должны знать, что когда функция возвращает один узел, она не обязательно будет возвращена как экземпляр NodeInfo, это может быть, например, LazySequence, чей метод head() необходимо вызвать для полученияNodeInfo.Вы действительно не хотите связываться с такими сложностями, если можете избежать этого;так что используйте s9api.

...