2

鉴于我的输入 XML:

<?xml version="1.0" encoding="utf-8"?>
<FlightAvailability>
    <FareDetails>
        <Fare ID="2007" DepartureDate="2012-11-23T07:05:00">
            <FareTypes>
                <FareType FareType="Promo1">
                    <FareInfo Class="Y" FareBasis="Y" Fare="1500"/>
                </FareType>
                <FareType FareType="Promo2">
                    <FareInfo Class="Y" FareBasis="Y" Fare="1000"/>
                </FareType>
            </FareTypes>
        </Fare>
        <Fare ID="2008" DepartureDate="2012-11-23T08:00:00">
            <FareTypes>
                <FareType FareType="Promo1">
                    <FareInfo Class="Y" FareBasis="Y" Fare="2500"/>
                </FareType>
                <FareType FareType="Promo2">
                    <FareInfo Class="Y" FareBasis="Y" Fare="2000"/>
                </FareType>
            </FareTypes>        
        </Fare>
    </FareDetails>
    <SegmentDetails>
        <Segment ID="2007" Origin="DEL" Destination="BOM"
            DepartureDate="2012-11-23T07:05:00" Airline="YY" ArrivalDate="2012-11-23T08:55:00"
            Stops="0" AircraftType="320"
            FlightNum="100"/>
        <Segment ID="2008" Origin="DEL" Destination="BOM"
            DepartureDate="2012-11-23T08:00:00" Airline="YY" ArrivalDate="2012-11-23T09:55:00"
            Stops="0" AircraftType="320" FlightNum="200"/>
    </SegmentDetails>
</FlightAvailability>

我想创建一个输出 XML,其中我选择 FareType“Promo1”的 FareTypes,并通过匹配 ID(例如 Fare 和 Segment 标签中的 2007)找到相应的 Segment。当我在 FareDetails/Fare 中迭代 for-each 并获取 ID 时,我如何传递 ID 并获取特定的 Segment 信息。我是 XSL 的新手,知道这可能应该用参数调用模板,其中参数是 ID,但无法设置它。我试图传递一个变量,但它没有从 Segments 中挑选任何东西。

这是我尝试过的 XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output  version="1.0" method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
   <xsl:element name="AvailRS">
        <xsl:element name="Availability">
                        <xsl:for-each select="//FareDetails/Fare">
                                <xsl:element name="item">
                                <xsl:element name="Fares">
                <xsl:variable name = "lfid" select="@ID"/>
                <xsl:element name = "ID"><xsl:value-of select="$lfid"/></xsl:element>
                <xsl:for-each select="FareTypes/FareType[@FareType='Promo1']">
                                        <xsl:element name="item">
                                    <xsl:element name="BaseAmount">
                        <xsl:value-of select="ceiling(FareInfo/@Fare)"/>
                           </xsl:element>
                           <xsl:element name="FareBasisCode">
                                <xsl:value-of select="FareInfo/@FareBasis"/>
                           </xsl:element>
                           <xsl:element name="FareClass">
                                <xsl:value-of select="FareInfo/@Class"/>
                           </xsl:element>
                          </xsl:element>
                        </xsl:for-each>
                        </xsl:element>
                <xsl:element name="Flights">
                    <xsl:variable name="seg" select="//SegmentDetails/Segment[@ID='$lfid']"/>
                          <xsl:element name="item">
                        <xsl:element name="FlightNumber"><xsl:value-of select="$seg/@FlightNum"/></xsl:element>
                        <xsl:element name="DepTime"><xsl:value-of select="$seg/@DepartureDate"/></xsl:element>
                        <xsl:element name="ArrTime"><xsl:value-of select="$seg/@ArrivalDate"/></xsl:element>
                        <xsl:element name="Origin"><xsl:value-of select="$seg/@Origin"/></xsl:element>
                        <xsl:element name="Destination"><xsl:value-of select="$seg/@Destination"/></xsl:element>
                        <xsl:element name="Stops"><xsl:value-of select="$seg/@Stops"/></xsl:element>
                        <xsl:element name="Aircraft"><xsl:value-of select="$seg/@AircraftType"/></xsl:element>
                      </xsl:element>
                        </xsl:element>
            </xsl:element>
                </xsl:for-each>
  </xsl:element>
  <Status>Success</Status>
  </xsl:element>
</xsl:template>
</xsl:stylesheet>

这不会从 Segment 中选择数据:

<AvailRS>
  <Availability>
    <item>
      <Fares>
        <ID>2007</ID>
        <item>
          <BaseAmount>1500</BaseAmount>
          <FareBasisCode>Y</FareBasisCode>
          <FareClass>Y</FareClass>
        </item>
      </Fares>
      <Flights>
        <item>
          <FlightNumber></FlightNumber>
          <DepTime></DepTime>
          <ArrTime></ArrTime>
          <Origin></Origin>
          <Destination></Destination>
          <Stops></Stops>
          <Aircraft></Aircraft>
        </item>
      </Flights>
    </item>
    <item>
      <Fares>
        <ID>2008</ID>
        <item>
          <BaseAmount>2500</BaseAmount>
          <FareBasisCode>Y</FareBasisCode>
          <FareClass>Y</FareClass>
        </item>
      </Fares>
      <Flights>
        <item>
          <FlightNumber></FlightNumber>
          <DepTime></DepTime>
          <ArrTime></ArrTime>
          <Origin></Origin>
          <Destination></Destination>
          <Stops></Stops>
          <Aircraft></Aircraft>
        </item>
      </Flights>
    </item>
  </Availability>
  <Status>Success</Status>
</AvailRS>

我想在上面的例子中得到的是与通过 ID 属性(2007、2008)连接的 Fare 对应的 Segment 信息,但是 $id 变量不起作用。如何选择对应的ID?

4

1 回答 1

2

您需要删除变量引用周围的引号。改变

//SegmentDetails/Segment[@ID='$lfid']

//SegmentDetails/Segment[@ID = $lfid]

否则,您将要求 XSLT 将 ID 属性的值与文字 string 进行比较$lfid

于 2012-11-07T20:45:59.627 回答