Функция distinct-values()
возвращает последовательность значений, которые вы должны иметь возможность перебирать. Результат так сказать "токенизированный".
fn:distinct-values('AL', 'AL', 'NL')
возвращает последовательность ('AL', 'NL')
.
Если вы выводите переменную с помощью xsl:value-of
, она вернет строку «AL NL» только потому, что разделитель последовательности по умолчанию для xsl:value-of
представляет собой один пробел. Это то, что вы можете изменить с помощью атрибута @separator
:
Input
<?xml version="1.0" encoding="UTF-8"?>
<States>
<State>AL</State>
<State>AL</State>
<State>NM</State>
</States>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<xsl:variable name="FormStates" select="distinct-values(States/State)"/>
<xsl:comment>xsl:value-of</xsl:comment>
<xsl:value-of select="$FormStates" separator=":"/>
<xsl:comment>xsl:for-each</xsl:comment>
<xsl:for-each select="$FormStates">
<xsl:value-of select="."/>
<xsl:text>:</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
выход
<?xml version="1.0" encoding="UTF-8"?>
<!--xsl:value-of-->
AL:NM
<!--xsl:for-each-->
AL:NM: