在 MarkLogic 函数中删除“fn:”?

Posted

技术标签:

【中文标题】在 MarkLogic 函数中删除“fn:”?【英文标题】:Drop the "fn:" in MarkLogic functions? 【发布时间】:2013-11-01 00:50:00 【问题描述】:

MarkLogic 有没有办法不必为每个 fn: 函数加上该前缀?我在网上看到很多代码表明我不需要它。

事情会变得相当冗长,你知道吗? fn:not(fn:contains(...)),而不是not(contains(...))

想法?

谢谢!

【问题讨论】:

【参考方案1】:

和你一样,我不想在我所有的 fn:functions 前面输入fn:

在普通的 XQuery 主模块中,您不需要 fn: 前缀,因为这是 默认函数名称空间,用于所有无前缀的函数。但是,您确实需要在库模块中使用fn:,因为它们将默认函数名称空间更改为库模块名称空间的名称。这意味着库函数可以在没有任何前缀的情况下相互调用。

但是你可以把它改回来!这是切换回来的标头代码。

xquery version "1.0-ml";
module namespace util = "http://markmail.org/util";
declare default function namespace "http://www.w3.org/2005/xpath-functions";

或者,如果您使用的是较旧的 0.9-ml:

xquery version "0.9-ml"
module "http://markmail.org/util"
declare namespace util = "http://markmail.org/util"
default function namespace = "http://www.w3.org/2003/05/xpath-functions"

它将模块放在给定的命名空间中,将 util 分配给该命名空间,然后将默认值分配回正常的 fn: 之一。

在这个开关之后,没有前缀的函数调用和定义将默认为fn:前缀;这意味着util 库中的所有函数都应显式使用util: 前缀。 (就我个人而言,我认为这样更干净。)

【讨论】:

V7 中有一个功能允许您为给定的应用程序服务器指定一组默认命名空间,我相信默认设置现在包括 fn。 甜蜜。在主要模块中对此一无所知。按照那里的广告工作。但是,开关不起作用。我在 ML5 上,在尝试您提供的代码时出现此错误:“意外的令牌语法错误,意外的 StringLiteral_,需要命名空间_”。我认为这与 ML 版本有关。 好的,用你的代码作为模型,我想我明白了:module namespace my-namespace = '';声明默认函数命名空间“w3.org/2005/xpath-functions”; 是的,MarkMail 是针对 xquery 版本“0.9-ml”编写的,您可能使用的是“1.0-ml”。我会调整我的答案。 现在...如果还有一种方法可以将 functx 函数也拉入默认命名空间...呵呵 :) ...感谢您的帮助!

以上是关于在 MarkLogic 函数中删除“fn:”?的主要内容,如果未能解决你的问题,请参考以下文章

MarkLogic 的“xdmp:collection-delete”是如何工作的?

MarkLogic:在 SPARQL 查询中使用聚合函数

not(expr|ele|fn)从匹配元素的集合中删除与指定表达式匹配的元素

[ jquery 方法 removeClass([class|fn]) ] 此方法为每个匹配的元素删除指定的类名

MarkLogic 的 xQuery 中的正则表达式

[ jquery 方法 toggleClass(class|fn[,sw]) ] 此方法如果存在(不存在)就删除(添加)一个类