给定一个使用distinct-values()函数返回不同状态列表的变量,有没有办法在for-each循环中对变量进行标记化?
<States>
<State>AL</State>
<State>AL</State>
<State>NM</State>
</States>
以下变量返回AL和NM,但我不能使用for-each迭代它。有办法解决这个问题吗?
<xsl:variable name="FormStates" select="distinct-values(States/State)"/>
<xsl:for-each select="$FormStates">
XSLT 2.0 ok。
答案 0 :(得分:5)
distinct-values()
函数返回一系列您应该能够迭代的值。结果就是“标记化”。
fn:distinct-values('AL', 'AL', 'NL')
返回序列('AL', 'NL')
。
如果使用xsl:value-of
输出变量,它将仅返回字符串“AL NL”,因为xsl:value-of
的默认序列分隔符是单个空格字符。您可以使用@separator
属性更改此内容:
<强>输入强>
<?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:
答案 1 :(得分:2)
这是我过去使用过的 XSLT 1.0 解决方案。
<xsl:template match="/">
<ul>
<xsl:for-each select="//State[not(.=preceding::*)]">
<li>
<xsl:value-of select="."/>
</li>
</xsl:for-each>
</ul>
</xsl:template>
返回:
<ul xmlns="http://www.w3.org/1999/xhtml">
<li>AL</li>
<li>NM</li>
</ul>
答案 2 :(得分:0)
理论上它应该有效;你确定给distinct-values
函数的XPath是否正确?您提供的代码要求States
元素是forms
元素的兄弟。
您可以在变量声明后立即插入<xsl:value-of select="count($FormStates)">
以确认它是否设置正确。