0

我正在使用 javascript 协调 MarkLogic 中的数据。目前,对于我的输出,我能够显示所有子元素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;

4

2 回答 2

0

不是 Javascript 专家,但如果您使用另一个根元素包装您的输入,然后在 Qconsole 上运行以下 xquery 代码,您将获得所需的结果。

`

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
}

`

于 2018-08-17T12:15:51.637 回答
0

如果您为每个项目创建一个单独的 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

于 2018-08-20T16:17:08.503 回答