【发布时间】:2014-02-06 09:58:04
【问题描述】:
我有一个如下的 XML:
<?xml version="1.0" encoding="utf-8"?>
<EnterpriseDocument ClientID="1000101" CreationTimestamp="2013-12-20T00:03:40.740" InterfaceName="InterfaceExport" ClientName="Zomba" CreationSource="Base" Version="1.0">
<BusinessUnitList>
<BusinessUnit buName="Site 1" buCode="0001" countryCode="TD">
<FuelItemList>
<FuelItem fuelItemID="0000001" fuelItemName="Fuel_1" fuelItemExtID="1" price="1.0001" priceType="Liquid" serviceType="Great" startDate="2013-12-19" startTime="10:15" />
<FuelItem fuelItemID="0000001" fuelItemName="Fuel_1" fuelItemExtID="1" price="1.0001" priceType="Liquid" serviceType="Great" startDate="2013-12-16" startTime="12:58" />
<FuelItem fuelItemID="0000002" fuelItemName="Fuel_2" fuelItemExtID="2" price="2.0001" priceType="LiquidSynthetic" serviceType="Great" startDate="2013-08-17" startTime="10:15" />
<FuelItem fuelItemID="0000002" fuelItemName="Fuel_2" fuelItemExtID="2" price="2.0001" priceType="LiquidSynthetic" serviceType="Great" startDate="2013-12-19" startTime="16:20" />
<FuelItem fuelItemID="0000003" fuelItemName="Fuel_3" fuelItemExtID="3" price="3.0001" priceType="LiquidHydrogen" serviceType="Great" startDate="2013-08-17" startTime="10:15" />
<FuelItem fuelItemID="0000003" fuelItemName="Fuel_3" fuelItemExtID="3" price="3.0001" priceType="LiquidHydrogen" serviceType="Great" startDate="2013-12-19" startTime="16:20" />
<FuelItem fuelItemID="0000004" fuelItemName="Fuel_4" fuelItemExtID="4" price="4.0001" priceType="LiquidNitrogen" serviceType="Great" startDate="2013-12-19" startTime="23:58" />
<FuelItem fuelItemID="0000004" fuelItemName="Fuel_4" fuelItemExtID="4" price="4.0001" priceType="LiquidNitrogen" serviceType="Great" startDate="2013-12-18" startTime="13:58" />
</FuelItemList>
</BusinessUnit>
<BusinessUnit buName="Site 2" buCode="0002" countryCode="GK">
<FuelItemList>
<FuelItem fuelItemID="0000001" fuelItemName="Fuel_1" fuelItemExtID="1" price="1.0001" priceType="Liquid" serviceType="Great" startDate="2013-12-19" startTime="12:15" />
<FuelItem fuelItemID="0000003" fuelItemName="Fuel_3" fuelItemExtID="3" price="3.0001" priceType="LiquidHydrogen" serviceType="Great" startDate="2013-08-17" startTime="18:20" />
<FuelItem fuelItemID="0000004" fuelItemName="Fuel_4" fuelItemExtID="4" price="4.0001" priceType="LiquidNitrogen" serviceType="Great" startDate="2013-12-19" startTime="22:58" />
<FuelItem fuelItemID="0000002" fuelItemName="Fuel_2" fuelItemExtID="2" price="2.0001" priceType="LiquidSynthetic" serviceType="Great" startDate="2013-08-17" startTime="12:15" />
<FuelItem fuelItemID="0000001" fuelItemName="Fuel_1" fuelItemExtID="1" price="1.0001" priceType="Liquid" serviceType="Great" startDate="2013-12-16" startTime="17:58" />
<FuelItem fuelItemID="0000002" fuelItemName="Fuel_2" fuelItemExtID="2" price="2.0001" priceType="LiquidSynthetic" serviceType="Great" startDate="2013-08-17" startTime="18:20" />
<FuelItem fuelItemID="0000003" fuelItemName="Fuel_3" fuelItemExtID="3" price="3.0001" priceType="LiquidHydrogen" serviceType="Great" startDate="2013-08-17" startTime="12:15" />
<FuelItem fuelItemID="0000004" fuelItemName="Fuel_4" fuelItemExtID="4" price="4.0001" priceType="LiquidNitrogen" serviceType="Great" startDate="2013-12-18" startTime="15:58" />
</FuelItemList>
</BusinessUnit>
</BusinessUnitList>
</EnterpriseDocument>
我需要得到如下输出:
<?xml version="1.0" encoding="utf-8"?>
<EnterpriseDocument ClientID="1000101" CreationTimestamp="2013-12-20T00:03:40.740" InterfaceName="InterfaceExport" ClientName="Zomba" CreationSource="Base" Version="1.0">
<BusinessUnitList>
<BusinessUnit buName="Site 1" buCode="0001" countryCode="TD">
<FuelItemList>
<FuelItem fuelItemID="0000002" fuelItemName="Fuel_2" fuelItemExtID="2" price="2.0001" priceType="LiquidSynthetic" serviceType="Great" startDate="2013-08-17" startTime="10:15" />
<FuelItem fuelItemID="0000003" fuelItemName="Fuel_3" fuelItemExtID="3" price="3.0001" priceType="LiquidHydrogen" serviceType="Great" startDate="2013-08-17" startTime="10:15" />
</FuelItemList>
</BusinessUnit>
<BusinessUnit buName="Site 2" buCode="0002" countryCode="GK">
<FuelItemList>
<FuelItem fuelItemID="0000002" fuelItemName="Fuel_2" fuelItemExtID="2" price="2.0001" priceType="LiquidSynthetic" serviceType="Great" startDate="2013-08-17" startTime="12:15" />
<FuelItem fuelItemID="0000003" fuelItemName="Fuel_3" fuelItemExtID="3" price="3.0001" priceType="LiquidHydrogen" serviceType="Great" startDate="2013-08-17" startTime="12:15" />
</FuelItemList>
</BusinessUnit>
<BusinessUnit buName="Site 2" buCode="0002" countryCode="GK">
<FuelItemList>
<FuelItem fuelItemID="0000003" fuelItemName="Fuel_3" fuelItemExtID="3" price="3.0001" priceType="LiquidHydrogen" serviceType="Great" startDate="2013-08-17" startTime="18:20" />
<FuelItem fuelItemID="0000002" fuelItemName="Fuel_2" fuelItemExtID="2" price="2.0001" priceType="LiquidSynthetic" serviceType="Great" startDate="2013-08-17" startTime="18:20" />
</FuelItemList>
</BusinessUnit>
<BusinessUnit buName="Site 1" buCode="0001" countryCode="TD">
<FuelItemList>
<FuelItem fuelItemID="0000002" fuelItemName="Fuel_2" fuelItemExtID="2" price="2.0001" priceType="LiquidSynthetic" serviceType="Great" startDate="2013-12-19" startTime="16:20" />
<FuelItem fuelItemID="0000003" fuelItemName="Fuel_3" fuelItemExtID="3" price="3.0001" priceType="LiquidHydrogen" serviceType="Great" startDate="2013-12-19" startTime="16:20" />
</FuelItemList>
</BusinessUnit>
</BusinessUnitList>
</EnterpriseDocument>
实现上述目标必须遵循的规则如下:
- 输出必须仅包含 FuelItemExtID= 2 或 3 的燃料项目。[过滤]
- 必须根据业务单位内每个燃料项目的 startDate 和 startTime 对输出进行排序。 [按升序排序,最新在上]
- 必须根据 startDate 和 startTime 组合的唯一值对输出进行分组。 [基于 concat(@startDate, '+', @startTime]的分组]
注意:我只需要 XSLT 1.0 版本的解决方案。
如果您需要任何说明,请告诉我。
我的尝试如下:
<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
exclude-result-prefixes="msxsl var" version="1.0">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:key name="GroupByStartDateTime" match="//FuelItem" use="concat(@startDate, '+', @startTime)" />
<xsl:template match="/" >
<EnterpriseDocument InterfaceName="{//@InterfaceName}" Version="{//@Version}" CreationTimestamp="{//@CreationTimestamp}" CreationSource="{//@CreationSource}" ClientID="{//@ClientID}" ClientName="{//@ClientName}" >
<BusinessUnitList>
<xsl:for-each select="//BusinessUnit">
<xsl:variable name="businessUnit" select="."/>
<xsl:for-each select="$businessUnit/FuelItemList/FuelItem">
<xsl:sort select="@startDate" />
<xsl:sort select="@startTime" />
<xsl:variable name="fuelItem" select="."/>
<xsl:for-each select="$fuelItem[generate-id() = generate-id(key('GroupByStartDateTime',concat(@startDate, '+', @startTime)))]">
<xsl:if test="@fuelItemExtID=2 or @fuelItemExtID=3">
<BusinessUnit buCode="{../../@buCode}" buName="{../../@buName}" countryCode="{../../@countryCode}" >
<FuelItemList>
<xsl:apply-templates select="key('GroupByStartDateTime',concat(@startDate, '+', @startTime))" mode="Item" />
</FuelItemList>
</BusinessUnit>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</BusinessUnitList>
</EnterpriseDocument>
</xsl:template>
<xsl:template match="FuelItem" mode="Item">
<FuelItem
fuelItemID="{@fuelItemID}"
fuelItemExtID="{@fuelItemExtID}"
fuelItemName="{@fuelItemName}"
price="{@price}"
startDate="{@startDate}"
startTime="{@startTime}"
priceType="{@priceType}"
serviceType="{@serviceType}"
/>
</xsl:template>
</xsl:stylesheet>
输出如下:
<EnterpriseDocument InterfaceName="InterfaceExport" Version="1.0" CreationTimestamp="2013-12-20T00:03:40.740" CreationSource="Base" ClientID="1000101" ClientName="Zomba">
<BusinessUnitList>
<BusinessUnit buCode="0001" buName="Site 1" countryCode="TD">
<FuelItemList>
<FuelItem fuelItemID="0000002" fuelItemExtID="2" fuelItemName="Fuel_2" price="2.0001" startDate="2013-08-17" startTime="10:15" priceType="LiquidSynthetic" serviceType="Great" />
<FuelItem fuelItemID="0000003" fuelItemExtID="3" fuelItemName="Fuel_3" price="3.0001" startDate="2013-08-17" startTime="10:15" priceType="LiquidHydrogen" serviceType="Great" />
</FuelItemList>
</BusinessUnit>
<BusinessUnit buCode="0001" buName="Site 1" countryCode="TD">
<FuelItemList>
<FuelItem fuelItemID="0000002" fuelItemExtID="2" fuelItemName="Fuel_2" price="2.0001" startDate="2013-12-19" startTime="16:20" priceType="LiquidSynthetic" serviceType="Great" />
<FuelItem fuelItemID="0000003" fuelItemExtID="3" fuelItemName="Fuel_3" price="3.0001" startDate="2013-12-19" startTime="16:20" priceType="LiquidHydrogen" serviceType="Great" />
</FuelItemList>
</BusinessUnit>
<BusinessUnit buCode="0002" buName="Site 2" countryCode="GK">
<FuelItemList>
<FuelItem fuelItemID="0000002" fuelItemExtID="2" fuelItemName="Fuel_2" price="2.0001" startDate="2013-08-17" startTime="12:15" priceType="LiquidSynthetic" serviceType="Great" />
<FuelItem fuelItemID="0000003" fuelItemExtID="3" fuelItemName="Fuel_3" price="3.0001" startDate="2013-08-17" startTime="12:15" priceType="LiquidHydrogen" serviceType="Great" />
</FuelItemList>
</BusinessUnit>
<BusinessUnit buCode="0002" buName="Site 2" countryCode="GK">
<FuelItemList>
<FuelItem fuelItemID="0000003" fuelItemExtID="3" fuelItemName="Fuel_3" price="3.0001" startDate="2013-08-17" startTime="18:20" priceType="LiquidHydrogen" serviceType="Great" />
<FuelItem fuelItemID="0000002" fuelItemExtID="2" fuelItemName="Fuel_2" price="2.0001" startDate="2013-08-17" startTime="18:20" priceType="LiquidSynthetic" serviceType="Great" />
</FuelItemList>
</BusinessUnit>
</BusinessUnitList>
</EnterpriseDocument>
【问题讨论】:
-
你尝试解决这个问题的例子在哪里?
-
我很抱歉最初没有分享我的尝试。