我是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
是每种乘客类型的更大价值乘以该类型的乘客。TotalPrice
是ToatalFare
和TotalFee
属性的总和。我已尝试使用以下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 :(得分: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>