【发布时间】:2014-08-22 20:34:35
【问题描述】:
我有一个XQuery 脚本,我想在将新文档导入数据库时对其进行评估。我想从一个字符串中评估一个带有谓词的Xpath 表达式,并使用结果来选择合适的集合。
如果所有代码都在XQuery 文件中,它会完美运行。我想让它比这更动态并阅读XPath 表达式 -> 动态集合映射。然后,在每个文档中,当XPath 表达式返回一个节点时,我就找到了正确的集合。
这可能吗? xdmp:unpath() 功能不够用。它不支持谓词。 xdmp:eval() 和 xdmp:value() 似乎可以工作,但我不能让它们只针对单个文档工作。要么是这样,要么就是在 500 个左右的文档之后开始失败(对于任何 XPath 表达式返回 true)。
我希望能够做这样的事情:
(: Get XML from MarkLogic Record Loader. :)
let $doc := xdmp:unquote($XML-STRING, $UNQ-NAMESPACE, $UNQ-OPTIONS)
(: Get XPath expression from database. :)
let $xpath := doc("/mappings.xml")/mappings/rule/xpath
(: Evaluate. :)
let $result := some-function($doc, $xpath)
(: Use the result.
return
if(fn:count($result) > 0)
( $collection )
else
()
是否有一些构造可以使“some-function($doc, $xpath)”工作?
似乎XQuery、XPath 表达式是语法的一部分,不能用字符串代替。我习惯了像 Perl 这样的其他语言,其中 XPath 始终是一个字符串,这样的事情是微不足道的。
谢谢。
【问题讨论】:
-
详细说明您使用
xdmp:eval()和xdmp:value()尝试的内容可能会对您有所帮助。我希望您可以简单地执行let $result := xdmp:value(concat($doc, $xpath))并且它会起作用。 -
尝试像 Perl 中的正则表达式一样考虑 XQuery 中的 XPath。在 Perl 中使用正则表达式进行元编程是可能的,但这些技术可能并不明显。在 XQuery 中使用 XPath 进行元编程是类似的。
-
xdmp:value 是我尝试的首批解决方案之一。更多分析见下文。我在记录加载器中执行此操作,但事情并没有按应有的方式工作。
-
我最后一次用那个特定的表达式“xdmp:value(concat($doc, $xpath))”试了一下,它确实工作正常。但由于下面详述的其他原因,我仍然坚持使用 XSL 解决方案。