有可能在我的逻辑瑕疵的地方,但试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:param name="firstYear" select="2012" />
<xsl:param name="lastYear" select="2015" />
<xsl:param name="times" select="2" />
<xsl:variable name="Years" select="$lastYear - $firstYear + 1" />
<xsl:key name="Trip" match="Trip" use="concat(@Year, '|', ../../@UD)" />
<xsl:template match="Customers">
<xsl:copy>
<xsl:apply-templates select="Customer[count(.//Trip
[@Year >= $firstYear and @Year <= $lastYear]
[generate-id() = generate-id(key('Trip', concat(@Year, '|', ../../@UD))[1])]
[count(key('Trip', concat(@Year, '|', ../../@UD))) >= $times]
) = $Years]" />
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
对每一个客户,这得到了一年的范围之间不同的出行次数,(所以对于一个为期三年的范围,例如,那么你需要三个不同的年份,否则这意味着他们每年都没有旅行),并且每个不同的年份都计算他们在一年中旅行的次数,以确保它符合要求。如果此类行程的总次数等于所需的年数,则可输出该客户。
** 1。** XML中只有一个客户。 - ** 2。**“最近X年每年X次以上”的条件含糊不清:这可能意味着在过去Y年的每一次**中X次以上,或者在过去的Y年中平均每年**超过X次**。 –
同意,XML中只有一个客户,但在根元素下会有更多。我希望得到在过去的Y年中一次旅行超过X次的客户。希望它现在更有意义。提前谢谢你的帮助。 – user2135025