XSLT 1 显示不同的值

  • 本文关键字:显示 XSLT 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>

谢谢。

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

为此,您可以定义一个键以按制造商名称查找车辆元素

<xsl:key name="Manufacturer" match="Vehicle" use="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>

此 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

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

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

更多信息在这里。

相关内容

  • 没有找到相关文章

最新更新