我有一个 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>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合并属性和值相同的所有ban
元素并从最新的值中选择值?job
login
reason
在这个例子中,我想将第一个与第二个ban
元素合并,因为它们都有job="gh:test/test#1"
和<login>user1</login>
,第三个与第五个元素合并,所以转换的结果应该是这样的:
<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>
使用 XSLT 3,您可以使用<xsl:for-each-group select="ban" group-by="@job, login" composite="yes">
:
如果存在
group-by
或group-adjacent
属性中的任何一个,则为总体中的每个项目计算一组分组键,如下所示:评估group-by
orgroup-adjacent
属性中包含的表达式;结果被雾化;并且任何xs:untypedAtomic
值都被转换为xs:string
.如果
composite="yes"
指定,则有一个单独的分组键,其值为结果序列;否则,有一组分组键,由结果序列中存在的不同原子值组成。
<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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句