时间:2010-07-26 15:39:46

标签: string xslt split

6 个答案:

答案 0 :(得分:36)

答案 1 :(得分:3)

使用fn:tokenize

答案 2 :(得分:2)

答案 3 :(得分:1)

谢谢user357812。我使用您的漂亮模板进行少量自定义以使其通用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <!-- Main template -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="tokenize-children" />
        </xsl:copy>
    </xsl:template>

    <!-- Split child nodes -->
    <xsl:template match="*" mode="tokenize-children">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <xsl:apply-templates select="*" mode="tokenize" />
        </xsl:copy>
    </xsl:template>

    <!-- Tokenize text node of child nodes -->
    <xsl:template match="*/text()" name="tokenize" mode="tokenize">
        <xsl:param name="text" select="."/>
        <xsl:param name="separator" select="','"/>
        <xsl:variable name="item"   select="name(..)" />
        <xsl:choose>
            <xsl:when test="not(contains($text, $separator))">
                <xsl:element name="{$item}">
                    <xsl:value-of select="normalize-space($text)"/>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:element name="{$item}">
                    <xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
                </xsl:element>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="text" select="substring-after($text, $separator)"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

答案 4 :(得分:1)

XSLT 1.0
与此处给出的其他答案相比,我需要一个轻微的变体。

<强>输入:

  

1,2,3

<强>输出继电器:

  

1,2和3

<强>输入:

  

1

<强>输出

  

1

如果分隔符是空格而不是逗号,它仍然有用。

<强>输入:

  

1 2 3

<强>输出继电器:

  

1,2和3

我刚刚创建了一个稍微修改过的模板。

<xsl:template name="tokenizeString">
<xsl:param name="list"/>
<xsl:param name="delimiter"/>
<xsl:choose>
    <xsl:when test="contains($list, $delimiter)">      
        <xsl:variable name="listLength" select="string-length($list)" />
        <xsl:variable name="listLengthWithoutDelimiters" select="string-length(translate($list, $delimiter,''))" />
        <xsl:variable name="noOfDelimiters" select="($listLength - $listLengthWithoutDelimiters)" />

        <xsl:value-of select="substring-before($list,$delimiter)"/>
        <xsl:if test="$noOfDelimiters > 1">, </xsl:if>
        <xsl:if test="$noOfDelimiters = 1"> and </xsl:if>
        <xsl:call-template name="tokenizeString">
            <xsl:with-param name="list" select="substring-after($list,$delimiter)"/>
            <xsl:with-param name="delimiter" select="$delimiter"/>
        </xsl:call-template>
    </xsl:when>
     <xsl:otherwise>
        <xsl:choose>
            <xsl:when test="$list = ''">
                <xsl:text/>
            </xsl:when>
            <xsl:otherwise>
                 <xsl:value-of select="$list"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:otherwise>
</xsl:choose>

当分隔符为逗号

时,可以按如下方式调用模板
<xsl:call-template name="tokenizeString">
    <xsl:with-param name="list">1, 2, 3</xsl:with-param>
    <xsl:with-param name="delimiter">
        <xsl:value-of select="','" />
    </xsl:with-param>
</xsl:call-template>

当分隔符为空格

时,可以按如下方式调用模板
<xsl:call-template name="tokenizeString">
    <xsl:with-param name="list">1 2 3</xsl:with-param>
    <xsl:with-param name="delimiter">
        <xsl:value-of select="' '" />
    </xsl:with-param>
</xsl:call-template>

答案 5 :(得分:0)

根据您使用的XSL处理器,您可以访问扩展功能str:tokenize()

所以要在Topic1,Topic2,Topic3上分割,;

<xsl:copy-of select="str:tokenize('Topic1,Topic2,Topic3', ',')"/>

将给出结果;

<token>Topic1</token>
<token>Topic2</token>
<token>Topic3</token>