我正在尝试在MarkLogic Data Hub标头中使用XPath。目标是从XML文档(内容)中获取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>
以下是我的协调流中的头插件代码:
'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(); -运行JavaScript请求时出错:TypeError:content.xpath不是函数
我是否缺少参考,或者当前逻辑中是否存在错误/不足?
答案 0 :(得分:2)
这是DHF的哪个版本?如果是2.x,则后端会进行一些翻译,实际上是在后台将事物作为对象和地图传递。 3.0可以更本地化地处理事情,并且这种翻译不会发生。
因此,当您运行此代码时,实际上是在后台将xml文档转换为map:map,然后将该值传递回javascript引擎(V8),该引擎将其解释为类型Object(序列为键:值,即xquery中映射到地图的值)。
因此,您可以通过几种方法解决此问题:一种方法是简单地fn.head(content)然后以点概念标识其属性:
let contentObj = fn.head(content);
header.BusinessUnit = contentObj.Property2;
这应该返回您所期望的。如果您需要动态交换属性,那么contentObj ['Property2']也应该为您工作。
我们已经确定在DHF中使用javascript和xml时这很直观,因此在下一发行版中,我们将转向将所有文档(无论是xml还是json)都视为服务器端javascript中的Nodes。这意味着它们将作为ObjectNode传递,因此您可以直接对它们进行点概念或xpath的处理。
答案 1 :(得分:0)
.xpath方法仅在文档上可用。在您的情况下,content
很可能不是文档。您可以使用xdmp.nodeKind