如何使用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>
使用key
和generate-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())