validaciones - Cómo usar XSLT para crear valores distintos
xslt editor (5)
Aquí hay una solución XSLT 1.0 que he usado en el pasado, creo que es más sucinta (y legible) que usar la función 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>
Devoluciones:
<ul xmlns="http://www.w3.org/1999/xhtml">
<li>laptop</li>
<li>charger</li>
<li>headphones</li>
</ul>
Tengo XML así:
<items>
<item>
<products>
<product>laptop</product>
<product>charger</product>
</products>
</item>
<item>
<products>
<product>laptop</product>
<product>headphones</product>
</products>
</item>
</items>
Quiero que salga como
laptop charger headphones
Estaba intentando usar distinct-values()
pero supongo que estoy haciendo algo mal. ¿Alguien puede decirme cómo lograr esto usando distinct-values()
? Gracias.
<xsl:template match="/">
<xsl:for-each select="//products/product/text()">
<li>
<xsl:value-of select="distinct-values(.)"/>
</li>
</xsl:for-each>
</xsl:template>
pero me está dando resultados como este:
<li>laptop</li>
<li>charger</li>
<li>laptop></li>
<li>headphones</li>
Llegué a este problema mientras trabajaba con una representación de Sitecore XSL. Tanto el enfoque que usó key () como el enfoque que utilizó el eje anterior se realizaron muy lentamente. Terminé usando un método similar a key () pero que no requería el uso de key (). Se realiza muy rápido.
<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>
No quiere "output (distinct-values)", sino "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>
Una solución XSLT 1.0 que usa key
y la función generate-id()
para obtener valores distintos:
<?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>
distinct-values(//product/text())