从输入xml中删除重复元素及其子节点

时间:2018-03-24 15:45:11

标签: xslt dataweave

我有xml格式的有效负载,我们必须从中删除重复的父节点和dataweave或xslt中的相应子节点。

<ns1:Hierarchy xmlns:ns1="http://www.example.org/Hierarchy" xmlns:ns2="http://www.example.org/HierarchyResult" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <ns2:Parent>19543007</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13277558</ns2:Children>
   </ns2:Children>
   <ns2:Parent>13277558</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13599506</ns2:Children>
   </ns2:Children>
   <ns2:Parent>11465977</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11580182</ns2:Children>
      <ns2:Children>13601740</ns2:Children>
      <ns2:Children>13709062</ns2:Children>
      <ns2:Children>13731947</ns2:Children>
      <ns2:Children>13735926</ns2:Children>
      <ns2:Children>14204010</ns2:Children>
      <ns2:Children>14209921</ns2:Children>
   </ns2:Children>
   <ns2:Parent>13601740</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13277558</ns2:Children>
      <ns2:Children>13599506</ns2:Children>
   </ns2:Children>
   <ns2:Parent>13735926</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13348972</ns2:Children>
   </ns2:Children>
   <ns2:Parent>13601740</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13277558</ns2:Children>
      <ns2:Children>13599506</ns2:Children>
   </ns2:Children>
   <ns2:Parent>11465977</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11580182</ns2:Children>
      <ns2:Children>13601740</ns2:Children>
      <ns2:Children>13709062</ns2:Children>
      <ns2:Children>13731947</ns2:Children>
      <ns2:Children>13735926</ns2:Children>
      <ns2:Children>14204010</ns2:Children>
      <ns2:Children>14209921</ns2:Children>
   </ns2:Children>
   <ns2:Parent>11465977</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11580182</ns2:Children>
      <ns2:Children>13601740</ns2:Children>
      <ns2:Children>13709062</ns2:Children>
      <ns2:Children>13731947</ns2:Children>
      <ns2:Children>13735926</ns2:Children>
      <ns2:Children>14204010</ns2:Children>
      <ns2:Children>14209921</ns2:Children>
   </ns2:Children>
   <ns2:Parent>11465977</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11580182</ns2:Children>
      <ns2:Children>13601740</ns2:Children>
      <ns2:Children>13709062</ns2:Children>
      <ns2:Children>13731947</ns2:Children>
      <ns2:Children>13735926</ns2:Children>
      <ns2:Children>14204010</ns2:Children>
      <ns2:Children>14209921</ns2:Children>
   </ns2:Children>
   <ns2:Parent>11465977</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11580182</ns2:Children>
      <ns2:Children>13601740</ns2:Children>
      <ns2:Children>13709062</ns2:Children>
      <ns2:Children>13731947</ns2:Children>
      <ns2:Children>13735926</ns2:Children>
      <ns2:Children>14204010</ns2:Children>
      <ns2:Children>14209921</ns2:Children>
   </ns2:Children>
   <ns2:Parent>11465977</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11580182</ns2:Children>
      <ns2:Children>13601740</ns2:Children>
      <ns2:Children>13709062</ns2:Children>
      <ns2:Children>13731947</ns2:Children>
      <ns2:Children>13735926</ns2:Children>
      <ns2:Children>14204010</ns2:Children>
      <ns2:Children>14209921</ns2:Children>
   </ns2:Children>
   <ns2:Parent>11465977</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11580182</ns2:Children>
      <ns2:Children>13601740</ns2:Children>
      <ns2:Children>13709062</ns2:Children>
      <ns2:Children>13731947</ns2:Children>
      <ns2:Children>13735926</ns2:Children>
      <ns2:Children>14204010</ns2:Children>
      <ns2:Children>14209921</ns2:Children>
   </ns2:Children>
   <ns2:Parent>99000016191</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11465977</ns2:Children>
   </ns2:Children>
</ns1:Hierarchy>

所需的输出必须如下所示

 <ns1:Hierarchy xmlns:ns1="http://www.example.org/Hierarchy" xmlns:ns2="http://www.example.org/HierarchyResult" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <ns2:Parent>19543007</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13277558</ns2:Children>
   </ns2:Children>
   <ns2:Parent>13277558</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13599506</ns2:Children>
   </ns2:Children>
   <ns2:Parent>11465977</ns2:Parent>
   <ns2:Children>
      <ns2:Children>11580182</ns2:Children>
      <ns2:Children>13601740</ns2:Children>
      <ns2:Children>13709062</ns2:Children>
      <ns2:Children>13731947</ns2:Children>
      <ns2:Children>13735926</ns2:Children>
      <ns2:Children>14204010</ns2:Children>
      <ns2:Children>14209921</ns2:Children>
   </ns2:Children>
   <ns2:Parent>13601740</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13277558</ns2:Children>
      <ns2:Children>13599506</ns2:Children>
   </ns2:Children>
   <ns2:Parent>13735926</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13348972</ns2:Children>
   </ns2:Children>
   <ns2:Parent>13601740</ns2:Parent>
   <ns2:Children>
      <ns2:Children>13277558</ns2:Children>
      <ns2:Children>13599506</ns2:Children>
   </ns2:Children>

对此有任何帮助将受到高度赞赏。我已尝试过dataweave和xslt的各种答案,但可以过滤掉重复的项目。

1 个答案:

答案 0 :(得分:2)

匹配ns1:Hierarchy的模板应该处理子ns2:Parent 元素,仅限于具有特定内容的第一个元素 (从而消除了重复的元素)。

为此,您需要:

  • 在模板之前:创建key(我将其命名为parents) 匹配ns2:Parent并保存其内容(use=".")。
  • 在模板中:将模板应用于ns2:Parent个节点 generate-id ... [1]谓词为真(脚本中的详细信息)。

匹配ns2:Parent的模板应该:

  • 复制自己的元素。
  • 复制以下同级ns2:Children元素,但仅限于这些元素 其中第一个兄弟ns2:Parent是当前的 ns2:Parent元素。

所以整个脚本可能如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns1="http://www.example.org/Hierarchy"
  xmlns:ns2="http://www.example.org/HierarchyResult">
  <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:key name="parents" match="ns2:Parent" use="."/>

  <xsl:template match="ns1:Hierarchy">
    <xsl:copy>
      <xsl:apply-templates select="ns2:Parent
        [generate-id()=generate-id(key('parents', .)[1])]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ns2:Parent">
    <xsl:copy-of select="."/>
    <xsl:copy-of select="following-sibling::ns2:Children
      [generate-id(preceding-sibling::ns2:Parent[1])=generate-id(current())]"/>
  </xsl:template>
</xsl:transform>

有关工作示例,请参阅http://xsltransform.net/ei5PwiW