Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 如何在XSL中为每个节点传递一个值,以便从另一个节点集中进行选择?_Variables_Xslt_Foreach - Fatal编程技术网

Variables 如何在XSL中为每个节点传递一个值,以便从另一个节点集中进行选择?

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:

<?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]