MarkLogic Data Hub Harmonization header 插件中的 运行 Xpath 出错

Error in running Xpath in MarkLogic Data Hub Harmonization header plugin

我正在尝试在 MarkLogic 数据中心使用 XPath header。目标是从 XML 文档 (content) 中获取 Property2 元素值(参见下面的示例)

<instance>
<info xmlns="">
   <title>Entity</title>
   <version>0.0.1</version>
 </info>
<Entity xmlns="">
    <Property1>100533</Property1>
    <Property2>130008HU46</Property2>
    <Property3>Z1-Electrico</Property3>
</Entity>

下面是我的协调流程中 header 插件的代码:

 'use strict'
 /*
 * Create Headers Plugin
 *
 * @param id       - the identifier returned by the collector
 * @param content  - the output of your content plugin
 * @param options  - an object containing options. Options are sent from Java
 *
 * @return - an object of headers
 */
 var he = require("/lib/hierarchyEditLib.sjs");
 var hd = require("/lib/headerLib.sjs");

 function createHeaders(id, content, options) {

 let ctx = createContext(content);  
 let guid = hd.generateUUID()

 return {
  "guid": guid,
  "sourceURI": id,
  "context" : ctx
     }
 }

 function createContext(content)
 {
 let header = {};
  
 header.BusinessUnit = content.xpath('//*:' + "Property2" + '/string()').toString();

 header.DateOfHarmonization =  fn.replace(fn.substring(fn.string(fn.currentDateTime()),1,10), "-", "/");
 header.TimeOfHarmonization = fn.string(fn.currentTime());
   
 return header;  
 }

 module.exports = {
 createHeaders: createHeaders
 };

每次我 运行 流程时,我总是在跟踪中看到以下错误:

JS-JAVASCRIPT: header.BusinessUnit = content.xpath('//*:' + "Property2" + '/string()').toString(); -- Error running JavaScript request: TypeError: content.xpath is not a function

我是否遗漏了任何参考资料,或者我当前的逻辑是否有问题/不足?

.xpath 方法仅适用于文档。在您的情况下,很可能 content 不是文档。您可以使用 xdmp.nodeKind

查看

这是哪个版本的 DHF?如果它是 2.x,那么后端会进行一些转换,实际上是在后台将事物作为对象和地图传递。 3.0 以更原生的方式处理事情,并且不会发生这种翻译。

所以当你是 运行 这个时,你实际上是在后台将 xml 文档翻译成 map:map,然后将该值传递回 javascript 引擎 (V8) 将其解释为类型对象(key:values 的序列,它是 xquery 中映射的镜像)。

因此,您可以通过几种方式解决此问题:其中一种方式是简单地 fn.head(content) 然后点概念识别其属性:

let contentObj = fn.head(content);
header.BusinessUnit = contentObj.Property2;

这应该 return 您所期望的。如果您需要动态交换 属性 的内容,contentObj['Property2'] 也应该适合您。

我们已经确定在 DHF 中使用 javascript 和 xml 时这很直观,因此在下一个版本中,我们将处理所有文档(无论是 xml或 json) 作为服务器端 javascript 中的节点。这意味着它们将作为 ObjectNode 传递,因此您可以开箱即用地对它们执行点概念或 xpath。