如何使用XSLT创build不同的值

我有这样的XML:

<items> <item> <products> <product>laptop</product> <product>charger</product> </products> </item> <item> <products> <product>laptop</product> <product>headphones</product> </products> </item> </items> 

我希望它输出像

笔记本电脑
充电器
头戴耳机

我试图使用distinct-values()但我想我做错了什么。 谁能告诉我如何实现这个使用distinct-values() ? 谢谢。

 <xsl:template match="/"> <xsl:for-each select="//products/product/text()"> <li> <xsl:value-of select="distinct-values(.)"/> </li> </xsl:for-each> </xsl:template> 

但它给我这样的输出:

 <li>laptop</li> <li>charger</li> <li>laptop></li> <li>headphones</li> 

使用keygenerate-id()函数获取不同值的XSLT 1.0解决scheme:

 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:key name="product" match="/items/item/products/product/text()" use="." /> <xsl:template match="/"> <xsl:for-each select="/items/item/products/product/text()[generate-id() = generate-id(key('product',.)[1])]"> <li> <xsl:value-of select="."/> </li> </xsl:for-each> </xsl:template> </xsl:stylesheet> 

这是我以前使用的XSLT 1.0解决scheme,我认为它比使用generate-id()函数更简洁(可读)。

  <xsl:template match="/"> <ul> <xsl:for-each select="//products/product[not(.=preceding::*)]"> <li> <xsl:value-of select="."/> </li> </xsl:for-each> </ul> </xsl:template> 

返回:

 <ul xmlns="http://www.w3.org/1999/xhtml"> <li>laptop</li> <li>charger</li> <li>headphones</li> </ul> 

你不想要“输出(不同值)”,而是“for-each(distinct-values)”:

 <xsl:template match="/"> <xsl:for-each select="distinct-values(/items/item/products/product/text())"> <li> <xsl:value-of select="."/> </li> </xsl:for-each> </xsl:template> 

我在使用Sitecore XSL渲染时遇到了这个问题。 使用key()的方法和使用前一个轴的方法都执行得非常缓慢。 我最终使用类似于key(​​)的方法,但不需要使用key()。 它执行得非常快。

 <xsl:variable name="prods" select="items/item/products/product" /> <xsl:for-each select="$prods"> <xsl:if test="generate-id() = generate-id($prods[. = current()][1])"> <xsl:value-of select="." /> <br /> </xsl:if> </xsl:for-each> 

distinct-values(//product/text())