Xml XSLT通过相同的键值合并节点子元素
我有一个这样的xmlXml 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
<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>