XSLT 1.0消除重复并拆分逗号分隔的字符串

时间:2016-08-30 14:36:27

标签: xslt xslt-1.0

我遇到过一个需要将逗号分隔的字符串分隔成多个不同元素的问题。 我找到了一个用于拆分字符串的模板和一个用于删除重复项的模板,但我不知道如何合并它们。

输入XML:

<?xml version="1.0"?>
<UDANotification>
    <ids>31777,31778,31779,31777,31778</ids>
</UDANotification>

我的xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="text()"/>
    <xsl:template match="UDANotification">


                                            <parameters>

                <xsl:variable name="string" select="ids"/>
                <xsl:call-template name="remove-duplicates">
                    <xsl:with-param name="string" select="translate($string, ' ', '')"/>
                    <xsl:with-param name="newstring" select="''"/>
                </xsl:call-template>
                <!--<<xsl:call-template name="tokenize"/>-->

                                                            </parameters>

    </xsl:template>

<xsl:template name="remove-duplicates">
        <xsl:param name="string"/>
        <xsl:param name="newstring"/>
        <xsl:choose>
            <xsl:when test="$string = ''">
                <xsl:value-of select="$newstring"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:if test="contains($newstring,substring-before($string, ','))">
                    <xsl:call-template name="remove-duplicates">
                        <xsl:with-param name="string" select="substring-after($string, ',')"/>
                        <xsl:with-param name="newstring" select="$newstring"/>
                    </xsl:call-template>
                </xsl:if>
                <xsl:if test="not(contains($newstring,substring-before($string, ',')))">
                    <xsl:variable name="temp">
                        <xsl:if test="$newstring = ''">
                            <xsl:value-of select="substring-before($string, ',')"/>
                        </xsl:if>
                        <xsl:if test="not($newstring = '')">
                            <xsl:element name="shift"><xsl:value-of select="concat($newstring, ',',substring-before($string, ','))"/></xsl:element>
                        </xsl:if>
                    </xsl:variable>
                    <xsl:call-template name="remove-duplicates">
                        <xsl:with-param name="string" select="substring-after($string, ',')"/>
                        <xsl:with-param name="newstring" select="$temp"/>
                    </xsl:call-template>
                </xsl:if>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>


    <!--
        <xsl:template match="UDANotification/ids" name="tokenize">
        <xsl:param name="ids" select="*"/>
        <xsl:param name="separator" select="','"/>
        <xsl:choose>
            <xsl:when test="not(contains($ids, $separator))">
                <shift>
                    <xsl:attribute name="id"><xsl:value-of select="normalize-space($ids)"/></xsl:attribute>
                </shift>
            </xsl:when>
            <xsl:otherwise>
                <shift>
                    <xsl:attribute name="id"><xsl:value-of select="normalize-space(substring-before($ids, $separator))"/></xsl:attribute>
                </shift>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="ids" select="normalize-space(substring-after($ids, $separator))"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
-->
</xsl:stylesheet>

注释部分是分割字符串的部分,也是消除重复字符串的活动部分。

期望的结果:

<parameters>
        <shift id="31777"/>
        <shift id="31778"/>
        <shift id="31779"/>
</parameters>

基本上拆分id字符串并消除重复值。 我被迫使用XSLT1.0和一个样式表。 有关如何合并这些模板的任何想法,或者是否有更好的方法在一个模板中同时执行重复消除和拆分? 感谢。

0 个答案:

没有答案