在单个分隔符上拆分子字符串,同时添加唯一的文本标记



在我的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>

相关内容

  • 没有找到相关文章

最新更新