【发布时间】:2013-08-08 20:59:03
【问题描述】:
我正在与一个营销平台合作,以展示一个人为航班订购的包。作为整个旅程的一部分,一名乘客可以有多个航段。因此,如果我们有像下面这样的记录(每条记录也分配了一个唯一的值,因为这在被拉出之前全部插入到数据库中,这里的 xml 是我正在使用的模型)。
编辑 8/9 - 下面的实际 XML 和修订的 XSLT。此外,如果您在 Bag 部分查看此链接 (http://f.spiritairlines.com/ats/msg.aspx?sg1=2e4a4d00cb00be84c598b618d6556e3e)。我希望它看起来像第二行(Pedro Smith)而不是第一行(Sandra Smith)。顺便说一句,这是所有测试数据,因此向您展示没有隐私问题,也没有任何私人信息。
<bookingcontact_to_booking>
<passenger_to_bookings>
<passenger_to_booking>
<Prop pk_id="4147" entity_id="126" val="SMITH" type_id="20" prop_name="lastname" prop_id="10208"/>
<Prop pk_id="4147" entity_id="126" val="PEDRO" type_id="20" prop_name="firstname" prop_id="10206"/>
<passseg_to_passengers>
<passseg_to_passenger>
<Prop pk_id="9432" entity_id="122" val="2013-08-27 17:45:00.000" type_id="30" prop_name="arrivaltime" prop_id="10216"/>
<Prop pk_id="9432" entity_id="122" val="188" type_id="20" prop_name="flightnumber" prop_id="10217"/>
<Prop pk_id="9432" entity_id="122" val="5" type_id="10" prop_name="checkedbagcount" prop_id="10220"/>
<Prop pk_id="9432" entity_id="122" val="1" type_id="10" prop_name="carryonbagcount" prop_id="10221"/>
<Prop pk_id="9432" entity_id="122" val="1" type_id="10" prop_name="journeynumber" prop_id="10222"/>
<Prop pk_id="9432" entity_id="122" val="0" type_id="10" prop_name="segmentnumber" prop_id="10223"/>
<Prop pk_id="9432" entity_id="122" val="2013-08-27 08:12:00.000" type_id="30" prop_name="departuretime" prop_id="10296"/>
<Prop pk_id="9432" entity_id="122" val="Las Vegas, NV" type_id="20" prop_name="departureairport" prop_id="10297"/>
<Prop pk_id="9432" entity_id="122" val="New York, NY - LaGuardia " type_id="20" prop_name="arrivalairport" prop_id="10298"/>
<Prop pk_id="9432" entity_id="122" val="10B,20B" type_id="20" prop_name="seatassignment" prop_id="10299"/>
</passseg_to_passenger>
<passseg_to_passenger>
<Prop pk_id="9433" entity_id="122" val="10B,20B" type_id="20" prop_name="seatassignment" prop_id="10299"/>
<Prop pk_id="9433" entity_id="122" val="Fort Lauderdale, FL" type_id="20" prop_name="arrivalairport" prop_id="10298"/>
<Prop pk_id="9433" entity_id="122" val="New York, NY - LaGuardia " type_id="20" prop_name="departureairport" prop_id="10297"/>
<Prop pk_id="9433" entity_id="122" val="2013-08-27 19:45:00.000" type_id="30" prop_name="departuretime" prop_id="10296"/>
<Prop pk_id="9433" entity_id="122" val="1" type_id="10" prop_name="segmentnumber" prop_id="10223"/>
<Prop pk_id="9433" entity_id="122" val="1" type_id="10" prop_name="journeynumber" prop_id="10222"/>
<Prop pk_id="9433" entity_id="122" val="1" type_id="10" prop_name="carryonbagcount" prop_id="10221"/>
<Prop pk_id="9433" entity_id="122" val="5" type_id="10" prop_name="checkedbagcount" prop_id="10220"/>
<Prop pk_id="9433" entity_id="122" val="779" type_id="20" prop_name="flightnumber" prop_id="10217"/>
<Prop pk_id="9433" entity_id="122" val="2013-08-27 22:45:00.000" type_id="30" prop_name="arrivaltime" prop_id="10216"/>
</passseg_to_passenger>
</passseg_to_passengers>
</passenger_to_booking>
</passenger_to_bookings>
</bookingcontact_to_booking>
我只想在每次旅程中显示一次 CarryOnBagCount 和 CheckedBagCount。我尝试了几种不同的方法,但我认为我离解决方案越来越远了。目前,无论旅程和航段如何,输出都是所有行李数量。 XSLT 在下面。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:key name="journey" match="passengersegment" use="Prop[@prop_name = 'journeynumber']/@val"/>
<xsl:template match="/">
<xsl:for-each select="/Msg/Props/bookingcontact_to_booking/passenger_to_bookings/passenger_to_booking">
<tr>
<td colspan="3">
<table style="text-align: left; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-size: 12px; color:#333333;"
border="0" cellspacing="0" cellpadding="0" width="542" align="left">
<tbody>
<tr>
<td height="22" width="200">
<xsl:value-of select="Prop[@prop_name = 'firstname']/@val" /><xsl:text> </xsl:text><xsl:value-of select="Prop[@prop_name = 'lastname']/@val" />
</td>
<xsl:apply-templates select="passengersegment[generate-id() = generate-id(key('journey', journeynumber)[1])]"/>
</tr>
</tbody>
</table>
</td>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="passengersegment">
<td style="text-align: left;" width="100">
<table style="text-align: left; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-size: 12px; color:#333333;" width="100">
<tr>
<xsl:for-each select="passseg_to_passengers/passseg_to_passenger">
<td width="50">
<xsl:value-of select="Prop[@prop_name = 'carryonbagcount']/@val" />
</td>
</xsl:for-each>
</tr>
</table>
</td>
<td style="text-align: left;" width="100">
<table style="text-align: left; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-size: 12px; color:#333333;" width="100">
<tr>
<xsl:for-each select="passseg_to_passengers/passseg_to_passenger">
<td width="50">
<xsl:value-of select="Prop[@prop_name = 'checkedbagcount']/@val" />
</td>
</xsl:for-each>
</tr>
</table>
</td>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
如果您能向我们展示您所期望的输出,将会有很大帮助。此外,这里使用的是 XSLT 1.0 或 XSLT 2.0,因为这看起来很像一个分组问题,并且分组在 2.0 中的处理方式不同。
-
@TimC 我正在使用 XSLT 1.0,您可以在这里看到我正在处理的版本。 f.spiritairlines.com/ats/…。如果您向下滚动到行李部分,随身携带和托运行李部分应各有 1 个空格 1。
-
可能跑题了,但希望引用的数据只是测试数据,否则我不确定您是否可以向我们展示:)
-
这个还是很模糊不清的。请向我们展示您希望将示例输入转换为的 xml 或 html。您的链接网页没有提供有关您期望的真实信息。您的试用版 xslt 与提供的数据的关系为零。请澄清。