使用 XSLT 1.0 过滤、分组、计数和选择 XML 中的特定节点

Filtering, Grouping, Counting and Selecting specific nodes in XML using XSLT 1.0

我有一些 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>

我想做的是 select 1 个特定模型(例如:KA),然后将系列分组到一个不同的列表中(没有重复),计算系列中有多少,但只显示最便宜,使用 XSLT 1.0。

EG。我的输出看起来像这样:

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" />&#32;<xsl:value-of select="Series" />&#32;<xsl:value-of select="Price" /><br />
      </xsl:for-each>
   </xsl:for-each>
</xsl:template> 

会很有帮助。谢谢

您有几个问题,第一个问题是 Vehicle 不是 Vehicle 的子项 - 因此从模板匹配的上下文中调用 <xsl:for-each select="Vehicle..."> 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>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>