如何在 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 - 如何将 2 个元素/兄弟元素组合成 1 个组