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 位序列.
在解决这个问题之前,我建议您用零填充代码点以使所有序列长度一致。
我正在使用 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 位序列.
在解决这个问题之前,我建议您用零填充代码点以使所有序列长度一致。