Верблюжий саксон Xquery: неправильное объявление пространства имен xmlns - PullRequest
0 голосов
/ 29 мая 2018

У меня большая проблема, которую я не могу понять.

У меня есть верблюжий маршрут с преобразованием xquery:

 <transform> 
        <xquery>resource:file {{choregraphies.resources.directory}}/LINCASA1/xquery/getTypApr_request.xquery
    </xquery>
    </transform>

Я поместил вас в getTypApr_request.xqueryfile

xquery version "1.0";
declare namespace xs="http://www.w3.org/2001/XMLSchema";
declare namespace com="com.edfgdf.a21.business.impl";
declare variable $in.headers.prmId as xs:string external;
declare variable $in.headers.id as xs:string external;

<com:getTypApr>
<idClient>{$in.headers.id}</idClient>
<reference>{$in.headers.prmId}</reference>
</com:getTypApr>

Раньше я был на верблюдах 2.17 и Saxon 9.5.1-5, все работает очень хорошо.Я недавно перешел на верблюда 2.21 и саксонской 9.8.0-8.И теперь я вижу, что у меня есть XqueryExpression в нуль.Верблюд возвращается ко мне: [Transform [XQuery xquery {[null]}] *

Я не знаю, что делать, не могли бы вы помочь мне

Thx

РЕДАКТИРОВАТЬ:

после исследования мой маршрут начинается с:

<routes xmlns="http://camel.apache.org/schema/spring">

Раньше Xbuilder не учитывал пространство имен дороги и теперь, если, следовательно, у меня ошибка:

org.apache.camel.RuntimeExpressionException: java.lang.IllegalArgumentException: Misdeclaration of xmlns namespace
    at org.apache.camel.component.xquery.XQueryBuilder.evaluate(XQueryBuilder.java:154) ~[camel-saxon-2.21.0.jar:2.21.0]
    at org.apache.camel.component.xquery.XQueryBuilder.evaluate(XQueryBuilder.java:119) ~[camel-saxon-2.21.0.jar:2.21.0]
    at org.apache.camel.processor.TransformProcessor.process(TransformProcessor.java:50) ~[camel-core-2.21.0.jar:2.21.0]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) ~[camel-core-2.21.0.jar:2.21.0]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [camel-core-2.21.0.jar:2.21.0]
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:138) [camel-core-2.21.0.jar:2.21.0]
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:101) [camel-core-2.21.0.jar:2.21.0]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [camel-core-2.21.0.jar:2.21.0]
    at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:298) [camel-core-2.21.0.jar:2.21.0]
    at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:210) [camel-core-2.21.0.jar:2.21.0]
    at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:155) [camel-core-2.21.0.jar:2.21.0]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_162]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_162]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_162]
Caused by: java.lang.IllegalArgumentException: Misdeclaration of xmlns namespace
    at net.sf.saxon.query.StaticQueryContext.declareNamespace(StaticQueryContext.java:719) ~[Saxon-HE-9.8.0-8.jar:na]
    at org.apache.camel.component.xquery.XQueryBuilder.initialize(XQueryBuilder.java:720) ~[camel-saxon-2.21.0.jar:2.21.0]
    at org.apache.camel.component.xquery.XQueryBuilder.evaluateAsDOM(XQueryBuilder.java:183) ~[camel-saxon-2.21.0.jar:2.21.0]
    at org.apache.camel.component.xquery.XQueryBuilder.evaluate(XQueryBuilder.java:144) ~[camel-saxon-2.21.0.jar:2.21.0]
    ... 13 common frames omitted

1 Ответ

0 голосов
/ 30 мая 2018

Саксон сообщает об ошибке, когда верблюд Apache пытается объявить привязку пространства имен, в которой либо (a) префикс равен «xmlns», либо (b) URI пространства имен равен «http://www.w3.org/2000/xmlns/".

I»проверили исходный код 9.5 и 9.8 для метода StaticQueryContext.declareNamespace (), и они кажутся идентичными: оба сообщают об этой ошибке, если появляется этот префикс или URI. Таким образом, это не саксонское изменение, которое вызвало проблему.

Префикс xmlns используется в объявлениях, таких как xmlns:p="my.uri". В DOM такие объявления обрабатываются как атрибуты, имя которых имеет (prefix = xmlns, local-name = p, uri = "http://www.w3.org/2000/xmlns/"). Byнапротив, в модели данных XDM, используемой XQuery, это объявление не считается узлом атрибута, это узел пространства имен с именем «p» и строковым значением «my.uri», и никогда не существует привязки к пространству имен дляпрефикс "xmlns" или URI "http://www.w3.org/2000/xmlns/". Раздел 4.13 спецификации XQuery 3.1 явно запрещает использование этого префикса или URI в объявлении пространства именion появляется в запросе, поэтому Saxon выдает ошибку, когда StaticQueryContext.declareNamespace () используется с этими значениями.

Я взглянул на исходный код Camel по адресу https://github.com/apache/camel/blob/master/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.javaи кажется правдоподобным, что Camel объявляет каждую привязку пространства имен, с которой он сталкивается в DOM, но мне нужно гораздо более глубокое понимание Camel, чтобы точно понять, что здесь происходит.

...