有没有一种简单的方法可以让以下代码只显示不同的值?
<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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
应用于示例 XML 时生成以下输出:
FORD
CHEVROLET
VAUXHALL
重要的部分是xsl:apply-templates
中的select
。它的工作原理是仅选择Vehicle
元素,其Manufacturer
未出现在同一级别的前Vehicle
元素之一中。
这必须是显示不同值的最简单方法......(<xsl:text>
</xsl:text>
只是显示新行)。
XSL
<xsl:template match="/">
<xsl:for-each select="//ManufacturerName[not(.=preceding::*)]">
<xsl:value-of select="." /><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
结果
FORD
CHEVROLET
VAUXHALL
更多信息在这里。