我有一些看起来像这样的XML
<Dealer>
<Vehicle>
<Model>KA</Model>
<Series>Type A</Series>
<Price>1000.00</Price>
</Vehicle>
<Vehicle>
<Model>KA</Model>
<Series>Type C</Series>
<Price>1400.00</Price>
</Vehicle>
<Vehicle>
<Model>KA</Model>
<Series>Type A</Series>
<Price>1100.00</Price>
</Vehicle>
<Vehicle>
<Model>FOCUS</Model>
<Series>Type B</Series>
<Price>5000.00</Price>
</Vehicle>
<Vehicle>
<Model>FIESTA</Model>
<Series>Type A</Series>
<Price>6000.00</Price>
</Vehicle>
</Dealer>
我要做的是选择1个特定的模型(例如:KA),然后将Series分组为一个不同的列表(没有重复),计算Series中有多少,但只显示最便宜的,使用XSLT 1.0。
。我的输出看起来像这样:
KA Type A 2 in stock starting from 1000.00
KA Type C 1 in stock starting from 1400.00
我一直在研究Muenchian的分组方法,但似乎无法将它与我想要实现的其他事情结合起来。
这是我下面的尝试。我的想法是,然后只显示每组的第一个项目,IE。最便宜的,并以某种方式对每组进行计数。
<xsl:strip-space elements="*"/>
<xsl:template match="/Dealer">
<xsl:apply-templates select="Vehicle[Model = 'KA']"/>
</xsl:template>
<xsl:key name="fSeries" match="Vehicle" use="Series" />
<xsl:template match="Vehicle">
<xsl:for-each select="Vehicle[count(. | key('fSeries', Series)[1]) = 1]">
<xsl:sort select="Price" />
<xsl:for-each select="key('fSeries', Series)">
<xsl:sort select="Price" />
<xsl:value-of select="Model" /> <xsl:value-of select="Series" /> <xsl:value-of select="Price" /><br />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
如果有任何帮助,我将非常感激。谢谢。
您有几个问题,其中第一个问题是Vehicle
不是Vehicle
的子元素-因此从匹配Vehicle
的模板上下文中调用<xsl:for-each select="Vehicle...">
将不会完成任何事情。
另一件事是你的钥匙匹配一个系列中的所有车辆,无论车型。
试试这样:
XSLT 1.0<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="vehicle-by-series" match="Vehicle[Model='KA']" use="Series" />
<xsl:template match="/Dealer">
<xsl:for-each select="Vehicle[Model='KA'][count(. | key('vehicle-by-series', Series)[1]) = 1]">
<xsl:value-of select="Model"/>
<xsl:text>: </xsl:text>
<xsl:value-of select="Series"/>
<xsl:text>, </xsl:text>
<xsl:variable name="grp" select="key('vehicle-by-series', Series)" />
<xsl:value-of select="count($grp)"/>
<xsl:text> in stock, starting from </xsl:text>
<xsl:for-each select="$grp">
<xsl:sort select="Price" data-type="number" order="ascending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="Price"/>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>