XSLT 根据分组的子值添加父节点

XSLT add a parent node according to the grouped children value

我是 XSLT 的新手,我正在尝试弄清楚如何添加父节点以根据子节点的值对数据进行分组。 (我不确定这是否有意义,但很难解释。)

这是原始输出:

    <root>
    <detailRow>
        <EmployeeID>123456</EmployeeID>
        <LastName>Doe</LastName>
        <FirstName>John</FirstName>
        <CompanyID>Cie_222</CompanyID>
    </detailRow>
    <detailRow>
        <EmployeeID>98765</EmployeeID>
        <LastName>Smith</LastName>
        <FirstName>John</FirstName>
        <CompanyID>Cie_222</CompanyID>
    </detailRow>
    <detailRow>
        <EmployeeID>100859</EmployeeID>
        <LastName>Roe</LastName>
        <FirstName>Richard </FirstName>
        <CompanyID>Cie_227</CompanyID>
    </detailRow>    
</root>

我想要这样的输出:

    <root>
    <GroupCompany id="Cie_222">
        <detailRow>
            <EmployeeID>123456</EmployeeID>
            <LastName>Doe</LastName>
            <FirstName>John</FirstName>
            <CompanyID>Cie_222</CompanyID>
        </detailRow>
        <detailRow>
            <EmployeeID>98765</EmployeeID>
            <LastName>Smith</LastName>
            <FirstName>John</FirstName>
            <CompanyID>Cie_222</CompanyID>
        </detailRow>
    </GroupCompany>

    <GroupCompany id="Cie_227">>        
    <detailRow>
        <EmployeeID>100859</EmployeeID>
        <LastName>Roe</LastName>
        <FirstName>Richard </FirstName>
        <CompanyID>Cie_227</CompanyID>
    </detailRow>
    </GroupCompany>     
</root>

目前我有这个代码:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
  <root>
      <xsl:for-each-group select="root/detailRow" group-by="CompanyID">
          <xsl:sort select="CompanyID"></xsl:sort>
          <xsl:copy>
              <GroupCompany id="CompanyID">
                  <xsl:copy-of select="current-group()"/>
              </GroupCompany>
          </xsl:copy>   
      </xsl:for-each-group>
  </root>     
</xsl:template>

您的分组看起来不错,只是您不需要 xsl:copy,而只需要 GroupCompany 包装器和属性的填充:

<xsl:template match="/">
  <root>
      <xsl:for-each-group select="root/detailRow" group-by="CompanyID">
          <xsl:sort select="CompanyID"></xsl:sort>
              <GroupCompany id="{current-grouping-key()}">
                  <xsl:copy-of select="current-group()"/>
              </GroupCompany>
      </xsl:for-each-group>
  </root>     
</xsl:template>