Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT通过相同的键值合并节点子元素_Xml_Xslt_Merge_Nodes - Fatal编程技术网

Xml XSLT通过相同的键值合并节点子元素

Xml XSLT通过相同的键值合并节点子元素,xml,xslt,merge,nodes,Xml,Xslt,Merge,Nodes,我有一个这样的xml <root> <field1>__<field1/> <field2>__<field2/> <list> <sublist1> <key>AAA</key> <field4>__</field4> </sublist1> <sublist1> <su

我有一个这样的xml

<root>
<field1>__<field1/>
<field2>__<field2/>
<list>
    <sublist1>
        <key>AAA</key>
        <field4>__</field4>
    </sublist1>
    <sublist1>
    <sublist1>
        <key>BBB</key>
        <field4>__</field4>
    </sublist1>
    <sublist2>
        <key>AAA</key>
        <field6>__<field6/>
    </sublist2>
    <sublist2>
        <key>BBB</key>
        <field6>__<field6/>
    </sublist2>
</list>

__
__
AAA
__
BBB
__
AAA
__
BBB
__

我需要根据元素key的值将子列表1与相应的子列表2合并。预期输出如下

<root>
<field1>__</field1>
<field2>__</field2>
<list>
    <mergedSublist>
        <key>AAA</key>
        <field4>__</field4>
        <field6>__</field6>
    </mergedSublist>
    <mergedSublist>
        <key>BBB</key>
        <field4>__</field4>
        <field6>__</field6>
    </mergedSublist>
</list>

__
__
AAA
__
__
BBB
__
__


如何使用xslt实现这一点?

下面是一个使用xsl的示例:对于每个组

XML输入(固定格式)


__
__
AAA
__
BBB
__
AAA
__
BBB
__
XSLT2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="list">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:for-each-group select="*" group-by="key">
        <mergedSublist>          
          <xsl:apply-templates select="key,current-group()/*[not(self::key)]"/>
        </mergedSublist>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

XML输出

<root>
   <field1>__</field1>
   <field2>__</field2>
   <list>
      <mergedSublist>
         <key>AAA</key>
         <field4>__</field4>
         <field6>__</field6>
      </mergedSublist>
      <mergedSublist>
         <key>BBB</key>
         <field4>__</field4>
         <field6>__</field6>
      </mergedSublist>
   </list>
</root>

__
__
AAA
__
__
BBB
__
__
如果您对XSLT正在做什么有任何疑问,请告诉我,我将添加更多详细信息


Fiddle:

那么你到底在哪里处理这个问题?使用XSLT应该很容易实现。什么版本的XSLT?如果>=2.0,请查看。如果是1.0,请看一下。我将所有子列表*重命名为子列表。现在,如果我使用以下命令,它将生成4个MergedPublist,而不是2个。请不要在注释中发布代码,而是编辑您的问题。请注意,如果输入只有
子列表1
子列表2
,则无需分组。只需处理
子列表1
,并使用键从相应的
子列表2
中添加字段。要理解您的答案,该怎么办?节点不包含属性。@Sebastien-对于示例XML,它不是必需的,可以删除。我通常基于标识转换创建新模板,并没有删除它,只是为了防止属性可能出现在
列表中
当前-group()[1]/key
可以缩短为
key
,因为组中的第一项是每个组的
中的上下文项。
<root>
   <field1>__</field1>
   <field2>__</field2>
   <list>
      <mergedSublist>
         <key>AAA</key>
         <field4>__</field4>
         <field6>__</field6>
      </mergedSublist>
      <mergedSublist>
         <key>BBB</key>
         <field4>__</field4>
         <field6>__</field6>
      </mergedSublist>
   </list>
</root>