2013-03-28 34 views
0

我正在嘗試制定一個轉換過程,該過程將帶有多個具有出發和到達航班的輸入處理爲具有航班完整路線的單個輸出。XSLT在單個輸出中連接來自多個節點的輸入

輸入如下:

<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,但我無法得到它的權利。我還需要根據出發日期對輸入進行排序,因爲航班可以採用不同的順序(根據樣本輸入)。

任何想法如何實現這一目標?

非常感謝!

布魯諾

回答

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> 

Working example

+0

謝謝Joepie。 解決方案沒有在我的情況下運行;我使用的是Oracle BPM,它說我只能使用 Bruno

0

感謝Joepie的啓示。再次

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

感謝:我不得不稍作修改得到它在我的環境中工作,結束了使用如下的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> 

當應用到例如產生下面的輸出!