2017-10-26 8 views
1

내 MLCP 변환 기능에서 map:get($context,"collections") 매개 변수를 사용하려고합니다 (MLCP 가이드 here에 설명 된 입력 매개 변수). -output_collections 매개 변수에 지정된 컬렉션을 사용하여 insert-update() 함수에 삽입 할 수 있습니다.MLCP 변환 모듈에서 output_collections 키 사용

doc이 데이터베이스에로드됩니다. & mlcp 출력은 오류를 나타내지 않지만 쿼리 콘솔을 보면 COLLTEST 대신 (콜렉션 없음) 표시됩니다. 콜렉션을 하드 코딩 할 때도 변환이 제대로 작동합니다 (원하지 않는). 지도 키를 잘못 사용하고 있습니까?

mlcp 컨텍스트 - 변환 - test.xqy :

xquery version "1.0-ml"; 
module namespace tx = "http://transform-test"; 
import module namespace dls = 'http://marklogic.com/xdmp/dls' at '/MarkLogic/dls.xqy'; 

(:Function to Add document to DLS Library Services:) 
declare function tx:insert-update($filename,$doc,$coll) { 
let $i := dls:document-is-managed($filename) 
return 
if ($i = fn:false()) then  
    dls:document-insert-and-manage($filename,fn:true(),$doc/*,(), 
(xdmp:permission('rest-reader', 'read'), xdmp:permission('rest-writer', 'insert')),($coll)) 
else  
    if ($i = fn:true()) then 
     dls:document-checkout-update-checkin(
     $filename, 
     $doc/*, 
     'CHECKIN-UPDATE-CHECKOUT', 
     fn:true(), 
     (xdmp:permission('rest-reader', 'read'), xdmp:permission('rest-writer', 'insert')), 
     ($coll)) 
else  
    () 
}; 

declare function tx:transform(
$content as map:map, 
$context as map:map 
) as map:map* { 

let $docnode := map:get($content, "value") 
let $collections := map:get($context, "collections") 
return 
if (fn:empty($docnode/element())) 
    then $content 
    else 
     let $root := $docnode/* 
     let $_:= 
      map:put($content, "value", 
      document {$root/preceding-sibling::node(), 
      element {fn:name($root)} { 
      $root/@*, 
      $root/node(), 
      element { xs:QName("metadata")} { 
        namespace {"docprop"} {"http://mynamespace"}, 
        'foobarfoo' 
        } 
      }, 
      $root/following-sibling::node() 
      })   

    return (map:put($content,"uri", 
    tx:insert-update(map:get($content, "uri"),map:get($content,"value"), 
    map:get($context, "collections")) 
      ), 
      $content 
      ) 
}; 

mlcp 명령을

mlcp.sh IMPORT -mode local \ 
-host localhost \ 
-port 8007 \ 
-username admin -password **** \ 
-input_file_path /MLCP-testdocs/testdocname.xml \ 
-output_uri_replace "/MLCP-testdocs,''" \ 
-output_uri_prefix /content/docs \ 
-output_uri_suffix .xml \ 
-output_collections COLLTEST \ 
-output_permissions rest-reader,read,rest-writer,insert \ 
-database top-songs \ 
-xml_repair_level full \ 
-transform_module /mlcp-context-transform-test.xqy \ 
-transform_namespace "http://transform-test" \ 
-document_type xml 

가 나는 또한 map:get($context,"output_collections")을 시도했습니다. 나에게 맞는 $context 매개 변수는 "transform_param"입니다. 도움이된다면 mlcp 8.0.6.3을 사용하고 있습니다.

+0

올바른 접근 방식입니다. MLCP의 최신 버전을 사용해 볼 수 있습니까? MarkLogic 8 이하에 대해 MLCP 9를 사용할 수 있습니다. – grtjn

+0

@ grtjn MLCP 9를 사용해 보았지만 여전히 작동하지 않았습니다. 나는'/ MarkLogic/hadoop.xqy'에있는'hadoop.xqy' 모듈을 살펴 봤고'$ collections'는'$ context' 맵에 포함되어 있지 않은 것으로 나타났습니다. 그래서 hadoop.xqy에'let $ dummy : = map : put ($ context, "collections", fn : tokenize ($ collections, ',') [. 올바른 접근 방식인지 또는이 모듈을 편집하는 것이 괜찮은지 확실하지 않습니다. – finchmontana

+0

MakLogic의 어떤 버전이 있습니까? 어쩌면 버전의 최신 패치 릴리스로 업그레이드하려고 시도 할 것입니다. – grtjn

답변

4

mlcp 8.0-6.3은 사용자가 변환 내부에서 문서 모음에 액세스하거나 수정할 수 없도록합니다.

https://github.com/marklogic/marklogic-contentpump/issues/34

수정 서버에 종속. 따라서 mlcp 9.0-x를 사용하여 8.0-6.4 이상의 서버에 연결해야합니다.

8.0-6.3의 해결 방법은 변환 함수 내에서 문서 삽입을 수행하고 변환 함수에서 빈 시퀀스를 반환하는 것입니다.

+0

이 해결 방법은'dls : document-insert-and-manage()'함수를 통해 작동 할 수 있습니까? 아마도 빈 시퀀스를 올바르게 반환하지 않을 것입니다 ... – finchmontana

+0

문서를 삽입하는 방법은 중요하지 않습니다. dls : document-insert-and-manage()가 정상적이어야합니다. 현재 버전에서는 transform_param을 통해 콜렉션을 설정하십시오. 이것이 변환 함수에 전달되는 유일한 명령 행 매개 변수입니다. –