XSLT在单个输出中连接来自多个节点的输入

时间:2013-03-28 12:13:50

标签: sorting xslt concatenation

我正在尝试进行一项转换,该转型会将带有出发和到达的多个航班的输入处理为具有完整航班路线的单个输出。

输入如下:

<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但是我无法正确使用它。我还需要根据出发日期对输入进行排序,因为航班可以采用不同的顺序(根据示例输入)。

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

非常感谢!

布鲁诺

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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>

再次感谢!