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



我有一些看起来像这样的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" />&#32;<xsl:value-of select="Series" />&#32;<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>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新