可用于省略字符串上重复值的函数 [英] Function that can be use to omit duplicate value on a string

查看:27
本文介绍了可用于省略字符串上重复值的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想问一下是否有一个函数可以用来删除以|分隔的字符串中的重复值最简单的方法.我有下面的字符串示例

I would like to ask if there is a function that can be use to to remove a duplicate value inside a string separated by | simplest possible way. I have below example of the string

1111-1|1111-1|1111-3|1111-4|1111-5|1111-3

我期望的输出是:

1111-1|1111-3|1111-4|1111-5

提前致谢.

推荐答案

要在没有扩展函数的纯 XSLT 1.0 中执行此操作,您将需要使用递归命名模板:

To do this in pure XSLT 1.0, with no extension functions, you will need to use a recursive named template:

<xsl:template name="distinct-values-from-list">
    <xsl:param name="list"/>
    <xsl:param name="delimiter" select="'|'"/>          
    <xsl:choose>
        <xsl:when test="contains($list, $delimiter)">
            <xsl:variable name="token" select="substring-before($list, $delimiter)" />
            <xsl:variable name="next-list" select="substring-after($list, $delimiter)" />           
            <!-- output token if it is unique -->
            <xsl:if test="not(contains(concat($delimiter, $next-list, $delimiter), concat($delimiter, $token, $delimiter)))">
                <xsl:value-of select="concat($token, $delimiter)"/>
            </xsl:if>
            <!-- recursive call -->
            <xsl:call-template name="distinct-values-from-list">
                <xsl:with-param name="list" select="$next-list"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$list"/>
        </xsl:otherwise>
    </xsl:choose>   
</xsl:template>

完整演示:http://xsltransform.net/ncdD7mM

上述方法输出列表中每个值的最后次出现,因为这是删除重复项的最简单方法.

The above method outputs the last occurrence of each value in the list, because that's the simplest way to remove the duplicates.

这样做的副作用是不会保留值的原始顺序.或者 - 更准确地说 - 它是被保留的反向顺序.

The side effect of this is that the original order of the values is not preserved. Or - more correctly - it is the reverse order that is being preserved.

我认为保留原始前向顺序在这里没有任何重要性.但是,如果您确实需要它,可以通过这种方式完成(我认为这比建议的替代方案更容易遵循):

I would not think preserving the original forward order is of any importance here. But in case you do need it, it could be done this way (which I believe is much easier to follow than the suggested alternative):

<xsl:template name="distinct-values-from-list">
    <xsl:param name="list"/>
    <xsl:param name="delimiter" select="'|'"/>    
    <xsl:param name="result"/> 
    <xsl:choose>
        <xsl:when test="$list">
            <xsl:variable name="token" select="substring-before(concat($list, $delimiter), $delimiter)" /> 
            <!-- recursive call -->
            <xsl:call-template name="distinct-values-from-list">
                <xsl:with-param name="list" select="substring-after($list, $delimiter)"/>
                <xsl:with-param name="result">
                    <xsl:value-of select="$result"/>
                    <!-- add token if this is its first occurrence -->
                    <xsl:if test="not(contains(concat($delimiter, $result, $delimiter), concat($delimiter, $token, $delimiter)))">
                        <xsl:value-of select="concat($delimiter, $token)"/>
                    </xsl:if>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="substring($result, 2)"/>
        </xsl:otherwise>
    </xsl:choose>   
</xsl:template>

这篇关于可用于省略字符串上重复值的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆