Xml 合并具有相同属性的元素
我有一个xml文档:Xml 合并具有相同属性的元素,xml,xslt,xpath,xquery,Xml,Xslt,Xpath,Xquery,我有一个xml文档: <bans> <ban job="gh:test/test#1"> <login>user1</login> <reason>reason one</reason> </ban> <ban job="gh:test/test#1"> <login>user1</login> <reason>reaso
<bans>
<ban job="gh:test/test#1">
<login>user1</login>
<reason>reason one</reason>
</ban>
<ban job="gh:test/test#1">
<login>user1</login>
<reason>reason two</reason>
</ban>
<ban job="gh:test/test#1">
<login>user2</login>
<reason>reason three</reason>
</ban>
<ban job="gh:test/test#2">
<login>user1</login>
<reason>reason four</reason>
</ban>
<ban job="gh:test/test#1">
<login>user2</login>
<reason>reason five</reason>
</ban>
</bans>
使用XSLT 3,您可以使用
:
如果存在分组依据
或分组相邻
属性之一,则针对总体中的每个项目计算一组分组键,如下所示:计算分组依据
或分组相邻
属性中包含的表达式;结果被雾化;并且任何xs:untypedAtomic
值都被强制转换为xs:string
如果指定了composite=“yes”
,则有一个分组键,其值为结果序列;否则,将有一组分组键,由结果序列中存在的不同原子值组成
你试过什么?xslt的哪个版本?这看起来更像是一个分组问题,您只需输出组中的最后一项。如果xml还有更多内容,而且确实需要合并,请您更新输入/输出示例,以显示
ban
之间不同元素的合并。这是一个标准的分组问题,因此最佳解决方案在很大程度上取决于您使用的XSLT版本,您忘了提及。
<bans>
<ban job="gh:test/test#1">
<login>user1</login>
<reason>reason two</reason>
</ban>
<ban job="gh:test/test#2">
<login>user1</login>
<reason>reason four</reason>
</ban>
<ban job="gh:test/test#1">
<login>user2</login>
<reason>reason five</reason>
</ban>
</bans>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="bans">
<xsl:copy>
<xsl:for-each-group select="ban" composite="yes" group-by="@job, login">
<xsl:copy-of select="current-group()[last()]"/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>