使用 XSLT 基于共同属性组合 2 个不同的 xml 标签

Combine 2 different xml tags based on common attribute using XSLT

我有一个 xml 下面的例子

<Message>
 <Person>
  <Key>111</Key>
  <Name>John</Name>
  <Age>20</Age>
 </Person>
 <Person>
  <Key>112</Key>
  <Name>Alex</Name>
  <Age>20</Age>
 </Person>
 <Person>
  <Key>113</Key>
  <Name>Sean</Name>
  <Age>20</Age>
 </Person>
 <Car>
  <Key>111</Key>
  <Make>Toyota</Make>
  <Model>Camry</Model>
 </Car>
 <Car>
  <Key>111</Key>
  <Make>Toyota</Make>
  <Model>Corolla</Model>
 </Car>
 <Car>
  <Key>112</Key>
  <Make>Honda</Make>
  <Model>Civic</Model>
 </Car>
 <Car>
  <Key>113</Key>
  <Make>Lexus</Make>
  <Model>G300</Model>
 </Car>
</Message>

我想使用 xslt 创建一个 xml:

<Message>
  <Person>
    <Key>111</Key>
    <Name>John</Name>
    <Age>20</Age>
  </Person>
  <Car>
    <Key>111</Key>
    <Make>Toyota</Make>
    <Model>Camry</Model>
  </Car>
  <Car>
    <Key>111</Key>
    <Make>Toyota</Make>
    <Model>Corolla</Model>
  </Car>
</Message>

我想为每个键创建一个消息段,并在其中为每个键创建 <person><car> 段。我如何使用 xslt 2.0 执行此操作?

<xsl:template match="Message">
        <xsl:for-each select="Person[Key = following-sibling::Car/Key]">
            <Message>
            <xsl:copy-of select="."/>
                <xsl:copy-of select="following-sibling::Car[Key = current()/Key]"/>
            </Message>
        </xsl:for-each>
    </xsl:template>
Check it

要按照评论中的建议使用 for-each-group,请使用

  <xsl:template match="Message">
      <xsl:for-each-group select="*" group-by="Key">
          <Message>
              <xsl:copy-of select="current-group()"/>
          </Message>
      </xsl:for-each-group>
  </xsl:template>

完整的样式表是

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

  <xsl:output indent="yes"/>

  <xsl:template match="Message">
      <xsl:for-each-group select="*" group-by="Key">
          <Message>
              <xsl:copy-of select="current-group()"/>
          </Message>
      </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

在线 https://xsltfiddle.liberty-development.net/gWmuiJs