在我的XSLT中,我使用令牌在单个分隔符(,)上分割子字符串,但是我如何放置唯一的文本来标记每个子字符串呢?谢谢你。
示例,XML文档:
<list>1,4,7,9</list>
所需输出:<w>1</w>
<x>4</x>
<y>7</y>
<z>9</z>
这个XSLT 1.0解决方案适用于您的示例。
它递归地以分隔符分隔输入,并根据作为参数提供的列表将各个部分分配给命名的元素。
当单个输入部分或元素名用完时(无论先发生什么),递归停止。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="list">
<xsl:call-template name="split">
<xsl:with-param name="input" select="." />
<xsl:with-param name="elems" select="'w,x,y,z'" />
<xsl:with-param name="delim" select="','" />
</xsl:call-template>
</xsl:template>
<xsl:template name="split">
<xsl:param name="input" select="''" />
<xsl:param name="elems" select="''" />
<xsl:param name="delim" select="','" />
<xsl:if test="$elems != '' and $input != '' and $delim != ''">
<xsl:variable name="curr-part" select="substring-before( concat($input, $delim), $delim)" />
<xsl:variable name="curr-elem" select="substring-before( concat($elems, $delim), $delim)" />
<xsl:element name="{$curr-elem}">
<xsl:value-of select="$curr-part" />
</xsl:element>
<xsl:call-template name="split">
<xsl:with-param name="input" select="substring-after($input, concat($curr-part, $delim))" />
<xsl:with-param name="elems" select="substring-after($elems, concat($curr-elem, $delim))" />
<xsl:with-param name="delim" select="$delim" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
这个模板生成,输入<list>1,4,7,9</list>
:
<w>1</w><x>4</x><y>7</y><z>9</z>
注意,示例输出缺少文档元素,因此不是一个有效的XML文档。
对前面的答案稍加修改,就可以基于generate-id和分隔值....的索引创建唯一的元素id
<xsl:template match="list">
<xsl:call-template name="split">
<xsl:with-param name="input" select="." />
<xsl:with-param name="delim" select="','" />
</xsl:call-template>
</xsl:template>
<xsl:template name="split">
<xsl:param name="input" select="''" />
<xsl:param name="index" select="1" />
<xsl:param name="delim" select="','" />
<xsl:if test="$input != '' and $delim != ''">
<xsl:variable name="curr-input" select="substring-before( concat($input, $delim), $delim)" />
<xsl:element name="{concat(generate-id(.),'-',$index)}">
<xsl:value-of select="$curr-input" />
</xsl:element>
<xsl:call-template name="split">
<xsl:with-param name="input" select="substring-after($input, concat($curr-input, $delim))" />
<xsl:with-param name="index" select="$index + 1" />
<xsl:with-param name="delim" select="$delim" />
</xsl:call-template>
</xsl:if>
</xsl:template>
这允许您生成唯一的节点,而不必提供节点名称列表…结果集将是:<d0e3-1>1</d0e3-1><d0e3-2>2</d0e3-2><d0e3-3>3</d0e3-3><d0e3-4>4</d0e3-4>