鉴于我的输入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?
答案 0 :(得分:2)
您需要删除变量引用周围的引号。变化
//SegmentDetails/Segment[@ID='$lfid']
到
//SegmentDetails/Segment[@ID = $lfid]
否则,您要求XSLT将ID属性的值与文字字符串$lfid
进行比较。