我遇到过一个需要将逗号分隔的字符串分隔成多个不同元素的问题。 我找到了一个用于拆分字符串的模板和一个用于删除重复项的模板,但我不知道如何合并它们。
输入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和一个样式表。 有关如何合并这些模板的任何想法,或者是否有更好的方法在一个模板中同时执行重复消除和拆分? 感谢。