【发布时间】:2023-03-16 08:47:01
【问题描述】:
我是 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。
-
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 计算不正确。请帮忙。谢谢。
【问题讨论】:
-
你说ADT乘客的数量是2,但实际上是4 ... ???请编辑问题并更正。
-
@DimitreNovaatchev - ADT 乘客数量为 2。Source XML 在不同航班上提供不同的 ADT 价格。第一个
Flight标签显示如果您乘坐此航班旅行,将收取 200+15=215,第二个Flight显示如果您乘坐此航班旅行,将收取 250+25=275。
标签: xml xpath xslt-1.0 transformation xslt-grouping