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

悟りを与えてくれたジョーピーに感謝します。私の環境で動作させるには、少し変更する必要があり、最終的には以下のように 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 に答える
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 に答える