XSLT 1.0 分组数据集包括不同的元素和 0 个或多个重复元素

XSLT 1.0 Grouping Dataset including distinct elements and 0 or more repeated elements

我正在尝试编写一些 XSLT,根据某些键控字段对 XML 数据进行分组。这些字段包括一些静态字段以及附加字段的潜力。

数据示例:

<ReportResult>
  <ReportHeader>
    <Header>Device Serial #</Header>
    <Header>Device Type</Header>
    <Header>Site ID</Header>
    <Header>Site Name</Header>
    <Header>Operation</Header>
    <Header>Option1</Header>
    <Header>Option 4</Header>
  </ReportHeader>
  <ReportData>
    <DataEntity>
      <kbserno>31513766</kbserno>
      <DeviceProductDesc>ExampleProductName</DeviceProductDesc>
      <SiteID>ExampleSiteID</SiteID>
      <SiteName>ExampleSiteName</SiteName>
      <OperationCodeDesc>Open</OperationCodeDesc>
      <KeyholderOption />
      <KeyholderOption />
    </DataEntity>
    <DataEntity>
      <kbserno>31513766</kbserno>
      <DeviceProductDesc>ExampleProductName</DeviceProductDesc>
      <SiteID>ExampleSiteID</SiteID>
      <SiteName>ExampleSiteName</SiteName>
      <OperationCodeDesc>Open</OperationCodeDesc>
      <KeyholderOption />
      <KeyholderOption />
    </DataEntity>
  </ReportData>
</ReportResult>

就目前而言,我有基于 kbsernoSiteIDOperationCodeDesc:

分组的代码
<xsl:for-each select="//DataEntity[generate-id(.) = generate-id(key('keyActivitySummary', concat(kbserno,'+',SiteID,'+',OperationCodeDesc))[1])]">
                
              <xsl:variable name="lngKbserno"><xsl:value-of select="kbserno" /></xsl:variable>
              <xsl:variable name="lngSite"><xsl:value-of select="SiteID" /></xsl:variable>
              <xsl:variable name="lngOperation"><xsl:value-of select="OperationCodeDesc" /></xsl:variable>
                
                
               <!-- Select all the entries that belong to that group -->
               <!--Create template to create select statement below dynamically based on groupingheaders-->
               <xsl:variable name="GroupList" select="//DataEntity[kbserno=$lngKbserno and 
                                                                OperationCodeDesc=$lngOperation and
                                                                  SiteID=$lngSite]" />
               <xsl:for-each select="$GroupList[1]/*">
                 <!-- Do stuff to the grouping -->
               </xsl:for-each>
</xsl:for-each>

基本上,我需要添加它,以便当日期中存在 KeyholderOption 标签时(如在给定的数据中),日期另外分组在每个数据实体中存在的第一个 KeyholderOption 上,第二个 KeyholderOption 存在,等等

此外,这些 KeyholderOption 实体中的值可以为 NULL(如图所示)。但是,所有实体将具有相同数量的这些条目(即,如果一个实体具有 2 个 KeyholderOptions,则所有实体将具有 2 个)。

我刚刚尝试将 KeyholderOption 添加到上面代码中的键,但这只会导致 none 的数据被正确输出。

这将是添加元素的第一个转换。然后,您可以对第二次变换使用 Muenchian 分组方法,并在需要时去掉密钥。随心所欲地玩转钥匙。

<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="DataEntity">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>

    <xsl:element name="key">
      <xsl:value-of select="concat(kbserno, '^^')"/>
      <xsl:value-of select="concat(SiteID, '^^')"/>
      <xsl:value-of select="concat(OperationCodeDesc, '^^')"/>
      <xsl:for-each select="KeyholderOption">
        <xsl:value-of select="concat(., '^^')"/>
      </xsl:for-each>
    </xsl:element>
    
  </xsl:copy>
</xsl:template>