XSLT 1显示不同的值

时间:2013-09-11 10:12:09

标签: xslt xslt-1.0

是否有一种简单的方法可以让以下代码只显示不同的值?

<xsl:template match="/">
   <xsl:for-each select="NewDataSet/Vehicle">
      <xsl:value-of select="ManufacturerName" />
   </xsl:for-each>

<!-- Does a load of other stuff down here -->

</xsl:template>

这基本上就是xml的样子:

<NewDataSet>
  <Vehicle>
   <ManufacturerName>FORD</ManufacturerName>
  </Vehicle>
  <Vehicle>
   <ManufacturerName>CHEVROLET</ManufacturerName>
  </Vehicle>
  <Vehicle>
   <ManufacturerName>VAUXHALL</ManufacturerName>
  </Vehicle>
  <Vehicle>
   <ManufacturerName>VAUXHALL</ManufacturerName>
  </Vehicle>
  <Vehicle>
   <ManufacturerName>VAUXHALL</ManufacturerName>
  </Vehicle>
</NewDataSet>

感谢。

3 个答案:

答案 0 :(得分:4)

要获得不同的值,最有效的方法通常是使用名为Muenchian Grouping的技术。您可能实际上并没有获得组中的所有车辆,但是为了获得不同的值,您可以有效地获得每个组中的第一个元素。

为此,您可以通过 ManufacturerName

定义用于查找车辆元素的键
<xsl:key name="Manufacturer" match="Vehicle" use="ManufacturerName" />

然后,要获取不同的值,您将遍历所有 Vehicle 元素,并选择其中第一个出现的元素 ManufacturerName

<xsl:for-each select="Vehicle
              [generate-id() = generate-id(key('Manufacturer', ManufacturerName)[1])]">

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:key name="Manufacturer" match="Vehicle" use="ManufacturerName" />

  <xsl:template match="/*">
    <xsl:for-each select="Vehicle[generate-id() = generate-id(key('Manufacturer', ManufacturerName)[1])]">
      <xsl:value-of select="ManufacturerName"/>
    </xsl:for-each>
    <!-- Does a load of other stuff down here -->
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

这个XSLT样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="NewDataSet">
    <xsl:apply-templates select="Vehicle[not(ManufacturerName=preceding-sibling::Vehicle/ManufacturerName)]"/>  
  </xsl:template>

  <xsl:template match="Vehicle">
    <xsl:value-of select="ManufacturerName"/>
    <xsl:text>&#xa;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

在应用于示例XML时生成以下输出:

FORD
CHEVROLET
VAUXHALL

重要的部分是select中的xsl:apply-templates。它的工作原理是只选择Vehicle元素,其中Manufacturer未出现在同一级别的前一个Vehicle元素之一中。

答案 2 :(得分:0)

这必须是显示不同值的最简单方法...(<xsl:text>&#xa;</xsl:text>只是为了显示新行。)

<强> XSL

<xsl:template match="/">
    <xsl:for-each select="//ManufacturerName[not(.=preceding::*)]">
        <xsl:value-of select="." /><xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
</xsl:template>

<强>结果

FORD
CHEVROLET
VAUXHALL

更多information here