如何反规范化 xml 文件?

How to denormalize xml file?

我有 3 个 XML 文件属于同一个系列,如下所述:

Aplha_a.xml

<root>
  <date>24-july-2017</date>
  <ID>001</ID>
  <data>a</data>
  <reg_date>24-july-2017</reg_date>
</root>

Aplha_b.xml

<root>
  <date>24-july-2017</date>
  <ID>001</ID>
  <data>b</data>
  <reg_date>24-july-2017</reg_date>
</root>

Aplha_c.xml

<root>
  <date>24-july-2017</date>
  <ID>001</ID>
  <data>c</data>
  <reg_date>24-july-2017</reg_date>
</root>

3 个不同的 XML 文件现在组织成单个 XML 文件,如下所述:

<Alpha_family>
    <root>
      <date>24-july-2017</date>
      <ID>001</ID>
      <data>a</data>
      <reg_date>24-july-2017</reg_date>
    </root>
    <root>
      <date>24-july-2017</date>
      <ID>001</ID>
      <data>b</data>
      <reg_date>24-july-2017</reg_date>
    </root>
    <root>
      <date>24-july-2017</date>
      <ID>001</ID>
      <data>c</data>
      <reg_date>24-july-2017</reg_date>
    </root>
</Alpha_family>

我需要通过仅返回不同节点将 3 XML 文件反规范化为单个 XML 系列元素。

<Alpha_family>
  <date>24-july-2017</date>
  <ID>001</ID>
  <data>a b c</data>
  <reg_date>24-july-2017</reg_date>
</Alpha_family>

谁能帮忙解决这个问题。

提前致谢。

所以不太清楚您希望如何组成新的 "denormalized" 节点,但是根据给出的示例输出,我假设您想要连接所有不同的值并用空格。

以下内容应该可以完成这项工作:

for $family in /Alpha_family
return element { $family/local-name() } {
  for $e in distinct-values($family/*/*/local-name())
  return element { $e } { distinct-values($family/*/*[local-name() = $e])}
}

它首先获取所有不同的元素名称,然后连接这些元素的不同值。