如何从for-each传递一个值来从XSL中的另一个节点集中选择?

时间:2012-11-07 19:54:33

标签: variables xslt foreach

鉴于我的输入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的新手并且知道这应该可以调用模板with-param,其中param是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)连接的票价相对应的细分信息,但$ id变量不起作用。如何选择相应的ID?

1 个答案:

答案 0 :(得分:2)

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

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

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

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