Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 合并具有相同属性的元素_Xml_Xslt_Xpath_Xquery - Fatal编程技术网

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

我有一个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 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>