Variables 如何在XSL中为每个节点传递一个值,以便从另一个节点集中进行选择?
给定我的输入XML:Variables 如何在XSL中为每个节点传递一个值,以便从另一个节点集中进行选择?,variables,xslt,foreach,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"
<?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”的FareType,并通过匹配ID(例如,Fare和Segment标记中的2007)找到相应的Segment。当我在FareDetails/Fare中迭代每个字段并获取ID时,我如何传递ID并获取特定的区段信息。我是XSL新手,知道这可能应该通过使用param调用模板来完成,其中param是ID,但无法设置它。我试图传递一个变量,但它没有从片段中拾取任何内容
这是我尝试过的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>
成功
这不会从段中拾取数据:
<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>
2007
1500
Y
Y
2008
2500
Y
Y
成功
在上面的例子中,我想得到的是与ID属性(2007,2008)连接的票价相对应的区段信息,但是$ID变量不起作用。如何选择相应的ID?您需要删除变量引用周围的引号。改变
//SegmentDetails/Segment[@ID='$lfid']
到
否则,您将要求XSLT将ID属性的值与文本字符串
$lfid
进行比较,这样就更容易确定您是否可以更正发布的XSL代码的缩进。+1是一个有详细说明的问题:显示输入、尝试的代码、实际输出和所需输出的描述。令人惊讶的是,这种情况是如此罕见。很抱歉,我们无法更早地作出回应-感谢您的评论-我们从上次沟通中了解到,@Dimitre!我之前尝试过使用引号和不使用引号,但使用“Unregistered variable”时失败-我相信这是因为变量不在范围内或类似的东西,或者因为变量本身不能重复设置为新值(更像是符号而不是变量)-这让我觉得我需要使用param做一个调用模板并传递当前ID?救命啊!令人沮丧的!只需将lfid变量向上移动到元素上方,它就被修复了:从元素上方移动到元素下方,修复了范围问题,我猜…@Surge,我不理解您所做的更改。。。在您问题中的“XSL I Tryed”代码中,“lfid”的变量定义就在(内部)
的下方,这是应该的。你是说它以前在别的地方吗?变量的值不能在其作用域内更改,但每次实例化其作用域时都会初始化一次。因此,在循环中定义的变量可以在循环的每次迭代中具有不同的值(但该值不能基于同一变量的“先前”值)。如果你有更多的问题,请告诉我。。。
//SegmentDetails/Segment[@ID = $lfid]