是否有一种简单的方法可以让以下代码只显示不同的值?
<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>
感谢。
答案 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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
在应用于示例XML时生成以下输出:
FORD
CHEVROLET
VAUXHALL
重要的部分是select
中的xsl:apply-templates
。它的工作原理是只选择Vehicle
元素,其中Manufacturer
未出现在同一级别的前一个Vehicle
元素之一中。
答案 2 :(得分:0)
这必须是显示不同值的最简单方法...(<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