在我的XSLT中,我使用标记在单个分隔符(,)上分割子字符串但是如何放置唯一文本来标记每个子字符串?谢谢。
示例,XML文档:
<list>1,4,7,9</list>
期望的输出:
<w>1</w>
<x>4</x>
<y>7</y>
<z>9</z>
答案 0 :(得分:0)
此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文档。
答案 1 :(得分:0)
对上一个答案的略微修改允许您基于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>