我有以下功能
declare private function local:get-map() as map:map*
{
let $map := map:map()
for $chart in xdmp:directory("/charts/")
for $panel in $chart/delphi:chart/delphi:panels/delphi:panel
for $dataline in $panel/delphi:datalines/delphi:dataline
let $datasetHref := $dataline/delphi:link[@rel="dataset"]/@href
let $axisId := $dataline/delphi:dimensions/delphi:dimension[@field="y"]/@axis
let $label := $panel/delphi:axes[@dimension="y"]/delphi:axis[@id=$axisId]/@label
let $l := map:get ($map, $datasetHref)
let $updateMap := if (fn:exists ($l)) then () else map:put ($map, $datasetHref, $label)
return $map
};
Run Code Online (Sandbox Code Playgroud)
我被迫声明返回类型,map:map*因为由于某种原因,$ map是一个地图数组而不是地图.该数组包含许多项目,其中每个项目包含我需要的相同地图.因此,当我调用此方法时,我使用第一项.问题是这不是很优雅.我不明白的是为什么我在数组中获得同一个地图的多个副本.我希望代码返回一个地图.我如何重写这个以解决问题?
我需要读取我本地文件系统上的xquery文件中的配置文件(XML或属性文件),即我不想将该配置文件放在marklogic数据库中.有没有办法实现这个目标?
我正在使用MarkLogic Content Pump来提取XML文档。我想使用“ -transform模块和-transform名称空间”选项在mlcp提取过程中转换这些xml文档。我已经为转换创建了XSLT,并将其加载到ML“模块”数据库中,但是mlcp不接受xslt文件并抛出错误:
命令:
mlcp.sh import \
-username $username -password $passwd \
-host $host -port $port \
-input_file_path $inpath \
-input_compressed true \
-input_file_type aggregates \
-aggregate_record_element $splittag \
-aggregate_uri_id $uriid \
-aggregate_record_namespace "http://www.fda.gov/cdrh/gudid" \
-output_collections $collection \
-output_permissions my-app-role,read,my-app-role,update \
-output_uri_suffix .xml \
-transform_module /marklogic.rest.transform/xml-transform-xsl/assets/transform.xsl \
-transform_namespace "http://marklogic.com/rest-api/transform/xml-transform-xsl" \
-transform_function transform
Run Code Online (Sandbox Code Playgroud)
下面的错误抛出ERROR:
15/09/27 15:34:19 WARN mapreduce.ContentWriter: XDMP-MODNOTTEXT: Module /marklogic.rest.transform/fda-transform-xsl/assets/transform.xsl is not a text document
Run Code Online (Sandbox Code Playgroud)
我想知道mlcp是否接受xslt转换?如果没有,那有什么选择呢?
MarkLogic在模块数据库中创建等效的xqy文件。通过在“ .xqy”文件下面调用,将引发参数不匹配错误:我认为这是由于错误的返回类型造成的:
xquery version "1.0-ml";
module namespace simple-xsl = "http://marklogic.com/rest-api/transform/simple-xsl";
import module namespace …Run Code Online (Sandbox Code Playgroud) 我正在使用xdmp:invoke调用在安全数据库中创建一个新角色.作为调用调用的选项,我指定了以下选项:
<options xmlns="xdmp:eval">
<database>{ xdmp:security-database() }</database>
<transaction-mode>update</transaction-mode>
<isolation>different-transaction</isolation>
<prevent-deadlocks>false</prevent-deadlocks>
</options>
Run Code Online (Sandbox Code Playgroud)
我的想法是,这将在一个单独的事务中执行,然后我将能够访问此调用后代码中的更改.但是当我使用我刚刚创建的角色的名称为xdmp:permission()创建一个all时,我得到一个Role Does Not Exist错误.
无论如何要解决这个问题?
更新
以下代码段有效.所以我会解决更多问题,看看我的更复杂的代码中是否还有其他问题.
xquery version "1.0-ml";
import module namespace sec = "http://marklogic.com/xdmp/security"
at "/MarkLogic/security.xqy";
let $create_role :=
xdmp:invoke-function(
function() {
sec:create-role(
'sec_test',
'Security Test Role',
(),
(),
()
)
},
<options xmlns="xdmp:eval">
<database>{xdmp:security-database()}</database>
<transaction-mode>update-auto-commit</transaction-mode>
<isolation>different-transaction</isolation>
</options>
)
return xdmp:permission('sec_test', 'read')
Run Code Online (Sandbox Code Playgroud)
第二次更新
似乎如果我调用的函数执行create-role是在另一个xqy文件中,那么它将失败并找不到角色错误.例如,我在security-util.xqy中有以下模块.
xquery version "1.0-ml";
module namespace asu = "http://ir.abbvie.com/marklogic/authorization/lib/security-util";
import module namespace sec = "http://marklogic.com/xdmp/security"
at "/MarkLogic/security.xqy";
declare option xdmp:mapping "false";
declare function asu:create-role-2(
$role_name …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种用于数据连接和转换到其他数据结构的noSQL解决方案 - 特别是在marklogic和couchbase.
我的问题:如何在基于json的数据库中进行xslt等转换?
XQuery Security Admin API信息发布在此处.
http://docs.marklogic.com/sec:create-user
我可能会遗漏一些东西,但我没有看到等效的JavaScript安全管理API.
是这样的吗?如果是这样,我们可以在下一个MarkLogic版本中期待这一点吗?
我在MarkLogic 之间element-range-index和之间感到困惑field-range-index.
请在示例的帮助下解释差异.
有没有办法找到没有范围索引的元素的频率?该
cts:frequency() 我使用的不支持任何不是词典的元素
我spell:suggest用来查询字典.我会假设结果按距离排序.但事实并非如此,如spell:suggest-detailed以下示例所示.
例:
spell:suggest-detailed("/my-dictionary.xml", "cohn",
<options xmlns="http://marklogic.com/xdmp/spell">
<distance-threshold>10</distance-threshold>
<maximum>3</maximum>
</options>
)
Run Code Online (Sandbox Code Playgroud)
结果:
<spell:suggestion original="cohn" dictionary="/my-dictionary.xml" xmlns:spell="http://marklogic.com/xdmp/spell">
<spell:word distance="10" key-distance="0" word-distance="50" levenshtein-distance="1">coin</spell:word>
</spell:suggestion>
<spell:suggestion original="cohn" dictionary="/my-dictionary.xml" xmlns:spell="http://marklogic.com/xdmp/spell">
<spell:word distance="10" key-distance="0" word-distance="50" levenshtein-distance="1">conn</spell:word>
</spell:suggestion>
<spell:suggestion original="cohn" dictionary="/my-dictionary.xml" xmlns:spell="http://marklogic.com/xdmp/spell">
<spell:word distance="9" key-distance="1" word-distance="45" levenshtein-distance="1">crohn</spell:word>
</spell:suggestion>
Run Code Online (Sandbox Code Playgroud)
第三个结果的距离是9,小于距离为10的前两个结果的距离.排序中是否有错误?
我在$ doc变量中使用了以下XML
let $doc := <root>
<date>12/31/2016</date>
</root>
Run Code Online (Sandbox Code Playgroud)
我想把这个日期与今天的日期进行比较.它应该归还给我,但它却让我失意.
我使用以下代码 -
let $doc := <root>
<date>12/31/2016</date>
</root>
let $date := $doc/date/text()
let $today :=fn:format-date(fn:current-date(),"[M01]/[D01]/[Y0001]")
return $date le $today
Run Code Online (Sandbox Code Playgroud)
有什么建议 ?