我有点需要使用 XSLT 创建“组组”。
下面是我的 XML 和 XSL 文件。我使用这个 SO链接来应用 Muenchian 分组。我试图缩短文件并仅显示代表问题的必需元素。
文件
<IO_SearchShoppingFilesResult xmlns="http://schemas.datacontract.org/2004/07/Trevoo.WS.IO.Shopping" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ShoppingFiles
xmlns:a="http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Shopping"
xmlns:b="http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Air">
<a:T_ShoppingFile>
....
<b:T_AirBookingItem>
...
<a:LocalPaxType>ADT</a:LocalPaxType>
...
</b:T_AirBookingItem>
<b:T_AirBookingItem>
...
<a:LocalPaxType>CHD</a:LocalPaxType>
...
</b:T_AirBookingItem>
<b:T_AirBookingItem>
...
<a:LocalPaxType>INF</a:LocalPaxType>
...
</b:T_AirBookingItem>
...
</a:T_ShoppingFile>
<a:T_ShoppingFile>
....
<b:T_AirBookingItem>
...
<a:LocalPaxType>ADT</a:LocalPaxType>
...
</b:T_AirBookingItem>
...
</a:T_ShoppingFile>
</ShoppingFiles>
</IO_SearchShoppingFilesResult>
XSL 文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:res="http://schemas.datacontract.org/2004/07/Trevoo.WS.IO.Shopping"
xmlns:a="http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Shopping"
xmlns:b="http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Air"
xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
xmlns:bb="http://schemas.datacontract.org/2004/07/Trevoo.WS.Entities.Shopping.Views">
<xsl:output method="xml" indent="yes" />
<xsl:key name="travelerGroup"
match="res:IO_SearchShoppingFilesResult/res:ShoppingFiles/a:T_ShoppingFile[position()=1]/a:AirBookings/b:T_AirBooking/b:BookingItems/b:T_AirBookingItem"
use="b:PaxReference/a:LocalPaxType" />
<xsl:template match="/">
<xsl:element name="PNRViewRS">
<xsl:apply-templates
select="res:IO_SearchShoppingFilesResult/res:ShoppingFiles" />
</xsl:element>
</xsl:template>
<xsl:template match="res:ShoppingFiles">
<!-- For FareGroup, Traveler, Telephone, EmailAddress -->
<xsl:apply-templates select="a:T_ShoppingFile" />
...
</xsl:template>
<xsl:template match="a:T_ShoppingFile">
...
<xsl:apply-templates
select="a:AirBookings/b:T_AirBooking/b:BookingItems/b:T_AirBookingItem[generate-id() = generate-id(key('travelerGroup', b:PaxReference/a:LocalPaxType)[1])]" />
...
</xsl:template>
...
<xsl:template match="b:T_AirBookingItem">
...
<!-- Line 1 -->
<xsl:value-of
select="count(key('travelerGroup', b:PaxReference/a:LocalPaxType))" />
...
</xsl:template>
可以看到,我已经申请key
了<b:T_AirBookingItem>
。并且 multiple<b:T_AirBookingItem>
存在于 multiple 中<a:T_ShoppingFile>
。
现在,我想分别处理每个<a:T_ShoppingFile>
,然后对其中的所有<b:T_AirBookingItem>
内容应用分组。在这段代码中发生的事情是<b:T_AirBookingItem>
所有的<a:T_ShoppingFile>
都一次组合在一起。
第 1 行显示了这种转换的结果之一。<b:T_AirBookingItem>
它应该显示一个特定的<a:LocalPaxType>
(比如 ADT)的<a:T_ShoppingFile>
总数。但是,它反而考虑<b:T_AirBookingItem>
了整个 XML 中的所有内容。
所以我应该得到“1”个ADT,我得到“2”。
我该如何处理?