1

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

<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>

谢谢。

4

3 回答 3

4

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

为此,您定义一个键以通过ManufacturerName查找Vehicle元素

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

然后,为了获得不同的值,您遍历所有Vehicle元素,并选择第一个出现在其给定制造商名称的键中的元素

<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>
于 2013-09-11T12:52:23.250 回答
2

这个 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

重要的部分是selectxsl:apply-templates. 它的工作原理是仅选择未出现在同一级别的前面Vehicle元素之一中的元素。ManufacturerVehicle

于 2013-09-11T11:34:56.793 回答
1

这必须是显示不同值的最简单方法......(这<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

更多信息在这里

于 2014-09-04T23:45:25.590 回答