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>
就目前而言,我有基于 kbserno
、SiteID
和 OperationCodeDesc
:
分组的代码
<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>
我正在尝试编写一些 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>
就目前而言,我有基于 kbserno
、SiteID
和 OperationCodeDesc
:
<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>