在MarkLogic Data Hub Harmonization标头插件中运行Xpath时出错

时间:2018-07-04 06:46:20

标签: javascript xpath marklogic

我正在尝试在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不是函数

我是否缺少参考,或者当前逻辑中是否存在错误/不足?

2 个答案:

答案 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

进行检查