xslt 2.0 从字符串到代码点中删除空格

xslt 2.0 remove spaces from string-to-codepoints

我正在使用 generate-id() 生成 ID,我使用字符串到代码点将此 ID 转换为数字。

如何从结果数字中删除空格?

例如结果代码点是“17 28 39 28”,但我需要“17283928”。

翻译不起作用,因为它需要一个字符串。而且我无法将数字转换为字符串,因为 string() 无法处理空格。

我怎样才能做到这一点?

根据您的评论,您在属性值模板中使用了 string-to-codepoints(generate-id()),在属性值模板中,如果表达式的计算结果为序列,则序列值的 space 分隔列表为插入。您需要在序列上使用 string-join 来构建单个字符串,或者您需要在属性值模板之外构建字符串,正如 <xsl:value-of select="string-to-codepoints(generate-id())" separator=""/> 所允许的那样。

这里是一个使用 string-join 的例子:

<xsl:template match="foo">
    <bar id="{string-join(for $n in string-to-codepoints(generate-id()) return string($n), '')}" />
</xsl:template>

这将构造一个类似 <bar id="1004910149"/> 的结果元素,但属性值中没有 space。

(不是答案,但评论太长了)。

有趣的补充:这个算法能保证密钥唯一吗?

是否可以有两个不同的字符串使得函数 string-join(string-to-codepoints($x)!string(), '') 产生相同的数字字符串?

我认为您很幸运,因为 generate-id() 保证生成仅由 ASCII 字母数字字符组成的字符串。这意味着所有字符的代码点必须在 48 到 122 范围内,这意味着每个代码点都会转换为 2 位或 3 位数字,通过查看第一个数字,您可以判断它是 2 位还是 3 位序列.

在解决这个问题之前,我建议您用零填充代码点以使所有序列长度一致。