Удалить повторяющееся имя родительского элемента в MarkLogic Javascript

Я работаю над согласованием данных в MarkLogic, используя javascript. В настоящее время для моего вывода я могу отображать все дочерние элементы Activity, но проблема в том, что родительский элемент Activities также отображается в двух экземплярах.

Вот текущий вывод, где <Activities> появляются только для каждого Activity:

<Activities datatype="array">
	<Activity>
	  <ActivityCrewSize>10</ActivityCrewSize>
	  <ActivitySeqNo>1</ActivitySeqNo>
	  <ActivityDesc/>
	</Activity>
</Activities>
<Activities datatype="array">
	<Activity>
	  <ActivityCrewSize>23</ActivityCrewSize>
	  <ActivitySeqNo>2</ActivitySeqNo>
	  <ActivityDesc/>
	</Activity>
</Activities>
<Activities datatype="array">
	<Activity>
	  <ActivityCrewSize>50</ActivityCrewSize>
	  <ActivitySeqNo>3</ActivitySeqNo>
	  <ActivityDesc/>
	</Activity>
</Activities>

И вот мой желаемый результат, где <Activities> появляется только один раз

<Activities datatype="array">
	<Activity>
	  <ActivityCrewSize>10</ActivityCrewSize>
	  <ActivitySeqNo>1</ActivitySeqNo>
	  <ActivityDesc/>
	</Activity>
	<Activity>
	  <ActivityCrewSize>23</ActivityCrewSize>
	  <ActivitySeqNo>2</ActivitySeqNo>
	  <ActivityDesc/>
	</Activity>
	<Activity>
	  <ActivityCrewSize>50</ActivityCrewSize>
	  <ActivitySeqNo>3</ActivitySeqNo>
	  <ActivityDesc/>
	</Activity>
</Activities>

Ниже мой текущий код для текущего вывода:

obj.Activities = [];

let act = {
    '$type': 'Activity',
    '$version': '0.0.1',
     }	
	 
for (const item of activities) {

	act.ActivityCrewSize = fn.normalizeSpace(hl.elementText(item, "CrewSize", true)); 
	act.ActivitySeqNo = fn.normalizeSpace(hl.elementText(item, "SeqNo", true)); 
	act.ActivityDesc = hl.elementText(item, null, true);

	obj.Activities.push(act);	
}

return obj;


person Ryan    schedule 17.08.2018    source источник
comment
если бы вы могли предоставить немного примеров данных и расширить свой код, чтобы показать, как эти объекты JSON преобразуются в XML, было бы намного проще помочь с вашим вопросом.   -  person Dave Cassel    schedule 20.08.2018


Ответы (2)


Не специалист по Javascript, но если вы оберните свой ввод другим корневым элементом, а затем запустите следующий код xquery на Qconsole, вы получите желаемый результат.

`

let $doc := <acts>
<Activities datatype="array">
    <Activity>
      <ActivityCrewSize>10</ActivityCrewSize>
      <ActivitySeqNo>1</ActivitySeqNo>
      <ActivityDesc/>
    </Activity>
</Activities>
<Activities datatype="array">
    <Activity>
      <ActivityCrewSize>23</ActivityCrewSize>
      <ActivitySeqNo>2</ActivitySeqNo>
      <ActivityDesc/>
    </Activity>
</Activities>
<Activities datatype="array">
    <Activity>
      <ActivityCrewSize>50</ActivityCrewSize>
      <ActivitySeqNo>3</ActivitySeqNo>
      <ActivityDesc/>
    </Activity>
</Activities>
</acts>
return 
<Activities datatype="array">
{
for $each in $doc/Activities/Activity
return $each
}

`

person Amit Gope    schedule 17.08.2018
comment
Спасибо за ответ, но решение должно быть в javascript - person Ryan; 28.08.2018

Если вы создадите отдельный объект JavaScript для каждого элемента, даст ли это желаемый результат?

Что-то вроде:

obj.Activities = [];

for (const item of activities) {
    obj.Activities.push({
    '$type': 'Activity',
    '$version': '0.0.1',
    ActivityCrewSize: fn.normalizeSpace(hl.elementText(item, "CrewSize", true)),
    ActivitySeqNo, fn.normalizeSpace(hl.elementText(item, "SeqNo", true)),
    ActivityDesc: hl.elementText(item, null, true)
     });
}

return obj;

Кроме того, NodeBuilder может создавать XML напрямую:

http://docs.marklogic.com/guide/jsref/api#id_90865

person ehennum    schedule 20.08.2018
comment
Привет @ehennum, спасибо за ваш ответ. Я пробовал это предложение, но родительские действия по-прежнему отображаются в двух экземплярах. - person Ryan; 28.08.2018
comment
Как предположил Дейв Кейселл, возможно, следующим шагом будет пересмотр вопроса, чтобы показать, как вы преобразуете JSON в XML. - person ehennum; 28.08.2018