Ошибка при запуске Xpath в плагине заголовка MarkLogic Data Hub Harmonization - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь использовать XPath в заголовке MarkLogic Data Hub. Цель состоит в том, чтобы получить значение элемента Property2 из XML-документа (содержимое) (см. Образец ниже)

<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: ошибка типа: content.xpath не является функцией

Есть ли какая-то ссылка, которую я пропускаю, или что-то не так / недостаточно в моей текущей логике?

Ответы [ 2 ]

0 голосов
/ 10 июля 2018

Для какой версии DHF это? Если это 2.x, тогда в бэкэнде происходит небольшой перевод, который фактически передает вещи как объекты и карты в фоновом режиме. 3.0 обрабатывает вещи более естественно, и этот перевод не происходит.

Итак, когда вы запускаете это, вы на самом деле переводите XML-документ на карту: map в фоновом режиме, а затем передаете это значение обратно в движок javascript (V8), который интерпретирует его как объект типа (последовательность ключ: значения, которые отражаются в xquery на карте).

Итак, вы можете решить эту проблему несколькими способами: одним из способов будет просто fn.head (content), а затем точка-понятие идентифицировать свойства из него:

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

Это должно вернуть то, что вы ожидаете. Если вам необходимо динамически поменять, каким будет свойство, contentObj ['Property2'] также должен работать для вас.

Мы определили, что это интуитивно понятно при работе с javascript и xml в DHF, поэтому в следующем выпуске мы перейдем к обработке всех документов (будь то xml или json) как узлов в javascript на стороне сервера. Это означает, что они будут переданы как ObjectNode, так что вы можете использовать точечное ИЛИ xpath для них в исходном виде.

0 голосов
/ 04 июля 2018

.xpath метод доступен только в Документах. Скорее всего, content в вашем случае не является Документом. Вы можете проверить с помощью xdmp.nodeKind

...