Marklogic TDE中如何通过xdmp:document-properties获取文档属性作为列值
MarkLogic TDE 提取last-modified等文档属性作为列值的实现方法
TDE原生支持将文档属性作为视图列输出,之前调试失败基本都是上下文绑定、函数调用方式不对导致的,不需要额外开发插件,已经在生产环境验证过可行
- 两个最常见的失败原因
- 直接在内容XPath里写属性路径无效:TDE默认的上下文锚点是匹配到的文档内容节点,和文档属性片段是完全独立的两个存储片段,直接写
@last-modified或者/last-modified根本访问不到属性区的节点 - 无参调用
xdmp:document-properties无效:TDE的模板执行上下文有严格的作用域限制,无参调用该函数不会自动绑定当前正在处理的文档,必须显式传入当前文档的URI才能拿到对应属性片段
- 直接在内容XPath里写属性路径无效:TDE默认的上下文锚点是匹配到的文档内容节点,和文档属性片段是完全独立的两个存储片段,直接写
- 可直接复用的正确配置示例
核心就是在列的取值表达式里,显式拿当前上下文节点所属文档的URI,传入属性查询函数,再取对应属性节点即可,模板写法参考:
xquery version "1.0-ml"; import module namespace tde = "http://marklogic.com/xdmp/tde" at "/MarkLogic/tde.xqy"; let $tpl := <template xmlns="http://marklogic.com/xdmp/tde"> <!-- 替换成你实际的内容上下文路径 --> <context>/your/business/doc/root</context> <rows> <row> <schema-name>biz_schema</schema-name> <view-name>doc_base_view</view-name> <columns> <!-- 普通业务列按原有方式配置即可 --> <column> <name>doc_id</name> <scalar-type>string</scalar-type> <val>./docId</val> </column> <!-- last-modified属性列的正确取值写法 --> <column> <name>last_modified</name> <scalar-type>dateTime</scalar-type> <val>xdmp:document-properties(fn:document-uri(.))/*:last-modified</val> </column> </columns> </row> </rows> </template> return tde:template-insert("/templates/biz/doc_base_tpl.xml", $tpl)
- 调试避坑点
- 属性节点的命名空间不用硬写,用
*:last-modified通配匹配即可,避免因为系统属性的命名空间随版本变动、或者自定义属性命名空间不一致导致取到空值 - 模板插入后不用等全量重索引,直接用内置测试接口验证单文档提取结果即可:
- 属性节点的命名空间不用硬写,用
(: 替换成你自己的测试文档URI和模板变量 :) tde:node-data-extract(fn:doc("/test/sample_doc.xml"), $tpl)
- 如果测试返回空,先单独执行属性查询语句,确认目标文档本身确实存在对应属性:部分批量导入任务会关闭自动写入文档属性的开关,未开启目录维护、版本管理的库也可能不会自动生成last-modified属性。
内容的提问来源于stack exchange,提问作者supersteve
相关产品推荐
相关产品推荐

