ฉันต้องการสร้าง "กลุ่มกลุ่ม" โดยใช้ XSLT
ด้านล่างนี้คือไฟล์ XML และ XSL ของฉัน ฉันใช้ลิงก์ SO นี้เพื่อใช้การจัดกลุ่ม Muenchian ฉันได้พยายามย่อไฟล์ให้สั้นลงและแสดงเฉพาะองค์ประกอบที่จำเป็นซึ่งแสดงถึงปัญหา
ไฟล์ XML
<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>
As one can see, I have applied key
on <b:T_AirBookingItem>
. And multiple <b:T_AirBookingItem>
are present in 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 ทั้งหมดแทน
แล้วฉันควรจะได้ ADT จำนวน "1" ที่ไหน ฉันจะได้ "2"
ฉันจะจัดการกับมันได้อย่างไร?