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

时间:2011-08-17 13:46:14

标签: xml xslt-1.0

在我的XSLT中,我使用标记在单个分隔符(,)上分割子字符串但是如何放置唯一文本来标记每个子字符串?谢谢。

示例,XML文档:

<list>1,4,7,9</list>

期望的输出:

<w>1</w>
<x>4</x>
<y>7</y>
<z>9</z>

2 个答案:

答案 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>