У меня есть XML как это:
<items>
<item>
<products>
<product>laptop</product>
<product>charger</product>
</products>
</item>
<item>
<products>
<product>laptop</product>
<product>headphones</product>
</products>
</item>
</items>
Я хочу, чтобы это произвело как
laptop charger headphones
Я пытался использовать 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>
Решение XSLT 1.0, использующее key
и функцию generate-id()
для получения отдельных значений:
<?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>
Вам нужен не «вывод (отдельные значения)», а «для каждого (отдельные значения)»:
<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>