如何在 XSLT 1.0 中获取具有唯一数字的数字?

Posted

技术标签:

【中文标题】如何在 XSLT 1.0 中获取具有唯一数字的数字?【英文标题】:How to get a number with unique digits in XSLT 1.0? 【发布时间】:2017-07-13 06:52:14 【问题描述】:

我有以下变量。

<xsl:variable name="number" select="56568"/>

需要输出:568

我需要得到一个仅包含数字中唯一数字的输出。

知道如何在 XSLT 1.0 中实现这一点吗?

谢谢

【问题讨论】:

哪个 XSLT 1.0 处理器?如果您可以访问某些扩展功能,这可能会更容易。 在 XSLT 2.0 当然你可以做codepoints-to-string(distinct-values(string-to-codepoints($in))) 【参考方案1】:

我认为没有一种简单的方法可以做到这一点 - 除非您的处理器支持某些扩展功能。没有它,您将不得不使用递归命名模板:

<xsl:template name="distinct-characters">
    <xsl:param name="input"/>
    <xsl:param name="output"/>
    <xsl:choose>
        <xsl:when test="not($input)">
            <xsl:value-of select="$output"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:variable name="char" select="substring($input, 1, 1)" />
            <!-- recursive call -->
            <xsl:call-template name="distinct-characters">
                <xsl:with-param name="input" select="substring($input, 2)"/>
                <xsl:with-param name="output">
                    <xsl:value-of select="$output"/>
                    <xsl:if test="not(contains($output, $char))">
                        <xsl:value-of select="$char"/>
                    </xsl:if>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>   
</xsl:template>

调用示例:

<output>
    <xsl:call-template name="distinct-characters">
        <xsl:with-param name="input" select="56568"/>
    </xsl:call-template>
</output>

结果:

<output>568</output>

演示:http://xsltransform.net/a9Gix1


补充:

4 年后重新审视这一点,有一种更短更有效的方法。它不是遍历输入中的每个字符,而是仅遍历每个 distinct 字符:

<xsl:template name="distinct-characters">
    <xsl:param name="input"/>
    <xsl:if test="$input">
        <xsl:variable name="char" select="substring($input, 1, 1)" />
        <xsl:value-of select="$char"/>
        <!-- recursive call -->
        <xsl:call-template name="distinct-characters">
            <xsl:with-param name="input" select="translate($input, $char, '')"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

演示:http://xsltransform.net/a9Gix1/1

【讨论】:

以上是关于如何在 XSLT 1.0 中获取具有唯一数字的数字?的主要内容,如果未能解决你的问题,请参考以下文章

在 XSLT 1.0 中使用前导零填充数字

数字标签 <images> XSLT / XML

XSLT 将输出标记为数字

XSLT 1.0 - 如何将 2 个元素/兄弟元素组合成 1 个组

使用 XSLT1.0 获取 XML 中标签 CASH_RECEIPT_LINE_NO 的唯一编号

有没有办法从字符串中获取数字并使用 XSLT 计算相同的总和?