Xquery “如何修复”;服务器消息:RESTAPI-INVALIDCONTENT:(错误:FOER0000)无效内容:";在Marklogic中?

Xquery “如何修复”;服务器消息:RESTAPI-INVALIDCONTENT:(错误:FOER0000)无效内容:";在Marklogic中?,xquery,marklogic,transformation,marklogic-9,Xquery,Marklogic,Transformation,Marklogic 9,我试图使用MarkLogicJavaAPI将xquery转换加载到模块DB中。最初,我使用工作正常的同一段代码加载Javascript转换(.sjs)。 现在,当我尝试用相同的代码加载xquery转换时,它不起作用 我的Xquery转换: xquery version "1.0-ml"; module namespace test = "http://marklogic.com/rest-api/transform/deepan"; declare function test:trans

我试图使用MarkLogicJavaAPI将xquery转换加载到模块DB中。最初,我使用工作正常的同一段代码加载Javascript转换(.sjs)。 现在,当我尝试用相同的代码加载xquery转换时,它不起作用

我的Xquery转换:

xquery version "1.0-ml";

module namespace test =
  "http://marklogic.com/rest-api/transform/deepan";

declare function test:transform(
  $context as map:map,
  $params as map:map,
  $content as map:map
) as map:map*
{
    let $jsoncont := xdmp:from-json-string($content)

    let $inputval := "fname,lname"
    let $orig-value := map:get($jsoncont, "value")

    let $jscode := "var simple = require('/wdsUtils.sjs');
                    var content, input;
                    simple.createUri(content,input);"

    let $uri := xdmp:javascript-eval($jscode,('content',$orig-value,'input',$inputval))
    map:put($content, "uri",$uri)
    map:put($content, "value",$orig-value)
    return $content  

};

    private static final String TRANSFORM_NAME = "sec";
    static String HOST = "localhost";
    static int PORT = 8136;
    static String USER = "admin";
    static String PASSWORD = "admin";
    private static DatabaseClient client = 
            DatabaseClientFactory.newClient(
                HOST, PORT, new DigestAuthContext(USER, PASSWORD));


    public static void loadLookup() throws FileNotFoundException 
    {

        TransformExtensionsManager extensionsManager=client.newServerConfigManager().newTransformExtensionsManager();
        FileInputStream fileInputStream=new FileInputStream("C:/Users/deepan/Desktop/sec.xqy");
        //System.out.println(fileInputStream.toString());
        InputStreamHandle handle=new InputStreamHandle(fileInputStream);
        //extensionsManager.writeJavascriptTransform(TRANSFORM_NAME, handle);
        extensionsManager.writeXQueryTransform(TRANSFORM_NAME, handle);
        client.release();

    }

要加载转换的Java代码:

xquery version "1.0-ml";

module namespace test =
  "http://marklogic.com/rest-api/transform/deepan";

declare function test:transform(
  $context as map:map,
  $params as map:map,
  $content as map:map
) as map:map*
{
    let $jsoncont := xdmp:from-json-string($content)

    let $inputval := "fname,lname"
    let $orig-value := map:get($jsoncont, "value")

    let $jscode := "var simple = require('/wdsUtils.sjs');
                    var content, input;
                    simple.createUri(content,input);"

    let $uri := xdmp:javascript-eval($jscode,('content',$orig-value,'input',$inputval))
    map:put($content, "uri",$uri)
    map:put($content, "value",$orig-value)
    return $content  

};

    private static final String TRANSFORM_NAME = "sec";
    static String HOST = "localhost";
    static int PORT = 8136;
    static String USER = "admin";
    static String PASSWORD = "admin";
    private static DatabaseClient client = 
            DatabaseClientFactory.newClient(
                HOST, PORT, new DigestAuthContext(USER, PASSWORD));


    public static void loadLookup() throws FileNotFoundException 
    {

        TransformExtensionsManager extensionsManager=client.newServerConfigManager().newTransformExtensionsManager();
        FileInputStream fileInputStream=new FileInputStream("C:/Users/deepan/Desktop/sec.xqy");
        //System.out.println(fileInputStream.toString());
        InputStreamHandle handle=new InputStreamHandle(fileInputStream);
        //extensionsManager.writeJavascriptTransform(TRANSFORM_NAME, handle);
        extensionsManager.writeXQueryTransform(TRANSFORM_NAME, handle);
        client.release();

    }

例外情况:

Exception in thread "main" com.marklogic.client.FailedRequestException: Local message: config/transforms write failed: Bad Request. Server Message: RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content: invalid sec extension: could not parse XQuery extension sec; please see the server error log for detail XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected Dollar_; sec either is not a valid module or does not provide extension functions (transform) in the http://marklogic.com/rest-api/transform/sec namespace
    at com.marklogic.client.impl.OkHttpServices.putPostValueImpl(OkHttpServices.java:2890)
    at com.marklogic.client.impl.OkHttpServices.putValue(OkHttpServices.java:2757)
    at com.marklogic.client.impl.TransformExtensionsImpl.writeTransform(TransformExtensionsImpl.java:356)
    at com.marklogic.client.impl.TransformExtensionsImpl.writeXQueryTransform(TransformExtensionsImpl.java:255)
    at com.marklogic.client.impl.TransformExtensionsImpl.writeXQueryTransform(TransformExtensionsImpl.java:249)
    at com.example.batch.Transform.loadLookup(Transform.java:33)
    at com.example.batch.Transform.main(Transform.java:40)

代码中似乎有语法错误。对此进行更改,它应该可以工作:

...
let $uri := xdmp:javascript-eval($jscode, ('content', $orig-value, 'input', $inputval))
let $_ := map:put($content, "uri", $uri)
let $_ := map:put($content, "value", $orig-value)
return $content
...
我在map:put表达式前面添加了
let$\:=

您的命名空间名称(sec)和转换名称(deepan)也不匹配:

module namespace test =
  "http://marklogic.com/rest-api/transform/sec";

declare function test:transform
...
此外,转换函数的接口必须与此接口匹配:

declare function yourNS:transform(
  $context as map:map,
  $params as map:map,
  $content as document-node())
as document-node()
将您的更改为以下内容:

declare function test:transform(
  $context as map:map,
  $params as map:map,
  $content as document-node()
) as document-node()

更多信息。

能否尝试使用扩展编写转换?当前,您的转换将命名为“sec”(无扩展名)。更改转换_NAME=“sec”;更新我的答案。你能再查一下吗?