0

我正在尝试制定一个转换,它将包含多个航班的输入(具有出发和到达)处理为具有航班完整路线的单个输出。

输入如下:

<FlightTrip>
   <flights>
      <departureAirport>
         <airportCode>LocB</airportCode>
      </departureAirport>
      <departureTime>2013-03-28T10:00:00.000</departureTime>
      <arrivalAirport>
         <airportCode>LocC</airportCode>
      </arrivalAirport>
   </flights>
   <flights>
      <departureAirport>
         <airportCode>LocA</airportCode>
      </departureAirport>
      <departureTime>2013-03-27T15:00:00.000</departureTime>
      <arrivalAirport>
         <airportCode>LocB</airportCode>
      </arrivalAirport>
   </flights>
   <flights>
      <departureAirport>
         <airportCode>LocC</airportCode>
      </departureAirport>
      <departureTime>2013-03-30T14:00:00.000</departureTime>
      <arrivalAirport>
         <airportCode>LocD</airportCode>
      </arrivalAirport>
   </flights>
</FlightTrip>

所需的输出将是这样的:

<FullTrip>LocA LocB LocC LocD</FullTrip>

我尝试在输出变量中使用 foreach ,但我做错了。我还需要根据出发日期对输入进行排序,因为航班的顺序可能不同(根据示例输入)。

关于如何实现这一目标的任何想法?

非常感谢!

布鲁诺

4

2 回答 2

0
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes"/>

    <xsl:template match="FlightTrip">
        <FullTrip>
            <xsl:apply-templates select="flights">
                <xsl:sort select="departureTime"/>
            </xsl:apply-templates>
        </FullTrip>
    </xsl:template>

    <xsl:template match="flights">
        <xsl:value-of select="departureAirport/airportCode"/><xsl:text> </xsl:text>
        <xsl:if test="position()=last()">
            <xsl:value-of select="arrivalAirport/airportCode"/>
        </xsl:if>
    </xsl:template>

</xsl:transform>

将产生:

<FullTrip>LocA LocB LocC LocD</FullTrip>

工作示例

于 2013-03-28T13:06:44.437 回答
0

感谢 Joepie 的启发。我不得不对其进行一些修改以使其在我的环境中工作,最终使用 foreach 如下:

  <xsl:template match="/">
      <xsl:variable name="locations">
        <xsl:for-each select="/FlightTrip/flights">
          <xsl:sort select="departureTime" order="ascending" data-type="text"/>
            <xsl:value-of select="concat(departureAirport/airportCode,' - ')"/>
            <xsl:if test="position() = last()">
                <xsl:value-of select="arrivalAirport/airportCode"/>
            </xsl:if>
         </xsl:for-each>
      </xsl:variable>

      <FullTrip>
          <xsl:value-of select="$locations"/>
      </FullTrip>

  </xsl:template>

应用于示例时会产生以下输出:

<FullTrip>LocA - LocB - LocC - LocD</FullTrip>

再次感谢!

于 2013-03-28T21:07:18.747 回答