2013-02-22 43 views
0

我是XSLT 1.0中的新手。當我試圖找到具有最高值的唯一節點時,我遇到了一個問題。XSLT 1.0查找具有最高值的唯一節點

源XML:

<Response> 
    <Flight> 
     <From>A</From> 
     <To>B</To> 
     <Passengers> 
      <Passenger> 
       <Fare>200</Fare> 
       <Fee>15</Fee> 
       <Type>ADT</Type> 
      </Passenger> 
      <Passenger> 
       <Fare>200</Fare> 
       <Fee>15</Fee> 
       <Type>ADT</Type> 
      </Passenger> 
      <Passenger> 
       <Fare>150</Fare> 
       <Fee>15</Fee> 
       <Type>CHD</Type> 
      </Passenger> 
     </Passengers> 
    </Flight> 
    <Flight> 
     <From>B</From> 
     <To>A</To> 
     <Passengers> 
      <Passenger> 
       <Fare>250</Fare> 
       <Fee>25</Fee> 
       <Type>ADT</Type> 
      </Passenger> 
      <Passenger> 
       <Fare>250</Fare> 
       <Fee>25</Fee> 
       <Type>ADT</Type> 
      </Passenger> 
      <Passenger> 
       <Fare>100</Fare> 
       <Fee>25</Fee> 
       <Type>CHD</Type> 
      </Passenger> 
     </Passengers> 
    </Flight> 
</Response> 

如上所示的XML,沒有爲A-B產地目的地的往返結果,我會購買門票的兩個航班。 我需要計算總票價,費用(以兩個航班中的最高者爲準)及其總價。

預期輸出:

<Result> 
    <PassengerGroup TotalFare="1150" TotalFee="75" TotalPrice="1225"/> 
</Result> 

這裏,

  • TotalFare是所有Fare標籤的總和。
  • TotalFee是每個乘客類型乘以該類型乘客數量的較大值。
  • 例如對於ADT,更高的費用值爲25,ADT的數量爲2,因此ADT的總費用爲50. 對於CHD更大費用值爲25,CHD爲1,因此CHD總費用爲25. 這使得最終總費用= 75.
  • TotalPriceToatalFareTotalFee屬性的總和。

我試過下面的XSLT。

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0" xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="Response"> 
     <xsl:element name="Result"> 
      <xsl:element name="PassengerGroup"> 
       <xsl:attribute name="TotalFare"> 
        <xsl:value-of select="sum(//Flight/Passengers/Passenger/Fare)"/> 
       </xsl:attribute> 
       <xsl:attribute name="TotalFee"> 
        <xsl:value-of select="sum(//Flight/Passengers/Passenger[not(Type=preceding::Passenger/Type)]/Fee)"/> 
       </xsl:attribute> 
       <xsl:attribute name="TotalFee"> 
        <xsl:value-of select="sum(//Flight/Passengers/Passenger/Fare) + sum(//Flight/Passengers/Passenger/Fee)"/> 
       </xsl:attribute> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

,並得到了以下的輸出。

輸出:

<Result> 
    <PassengerGroup TotalFare="1150" TotalFee="30" TotalPrice="1270"/> 
</Result> 

TotalFee不正確地計算。請幫忙。謝謝。

+0

你說ADT乘客數量爲2,但它實際上是4 ... ???請編輯問題並更正。 – 2013-02-23 16:39:03

+0

@DimitreNovatchev - ADT乘客的數量是2. Source XML在不同的航班上使用不同的ADT價格。首先「飛行」標籤顯示,如果您搭乘此航班旅行,它將收取200 + 15 = 215,第二個「航班」顯示如果您搭乘此航班旅行,它將收取250 + 25 = 275。 – 2013-02-25 06:17:37

回答

0

我相信這應該這樣做:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0" xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="kPassenger" match="Passenger" use="Type" /> 

    <!-- The passenger nodes from just the first flight, so we can count how many of 
     each type there are --> 
    <xsl:variable name="passengers" select="Response/Flight[1]/Passengers/Passenger" /> 

    <xsl:template match="Response"> 
    <xsl:variable name="totalFare" select="sum(Flight/Passengers/Passenger/Fare)" /> 
    <xsl:variable name="feeByPassenger"> 
     <xsl:apply-templates 
     select="$passengers[generate-id() = 
          generate-id(key('kPassenger', Type)[1])]" 
     mode="fee" /> 
    </xsl:variable> 
    <xsl:variable name="totalFee" 
        select="sum(exslt:node-set($feeByPassenger)/*/@value)" /> 

    <Result> 
     <PassengerGroup TotalFare="{$totalFare}" TotalFee="{$totalFee}" 
         TotalPrice="{$totalFare + $totalFee}" /> 
    </Result> 
    </xsl:template> 

    <xsl:template match="Passenger" mode="fee"> 
    <xsl:variable name="maxFee"> 
     <xsl:apply-templates select="key('kPassenger', Type)/Fee"> 
     <xsl:sort select="." data-type="number" order="descending"/> 
     </xsl:apply-templates> 
    </xsl:variable> 
    <fee value="{$maxFee * count($passengers[Type = current()/Type])}"/> 
    </xsl:template> 

    <xsl:template match="Fee"> 
    <xsl:if test="position() = 1"> 
     <xsl:value-of select="." /> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

當你的樣品輸入運行,其結果是:

<Result> 
    <PassengerGroup TotalFare="1150" TotalFee="75" TotalPrice="1225" /> 
</Result> 
相關問題