我该如何在XSL中去除字符的重音符号?

6

我一直在寻找一个与“normalize-space”等效的XSL函数,用于处理字符。也就是说,我的内容包含重音UNICODE字符,这很好,但是从这些内容中,我正在创建一个文件名,而我不希望这些重音出现。

那么,我是否忽略了某些东西,或者没有正确地搜索到易于处理字符的方法?

在XML数据中:

<filename>gri_gonéwiththèw00mitc</filename>

在XSLT样式表中:

<xsl:variable name="file">
    <xsl:value-of select="filename"/>
</xsl:variable>

<xsl:value-of select="$file"/>

结果为“gri_gonéwiththèw00mitc”

其中

<xsl:value-of select='replace( normalize-unicode( "$file", "NFKD" ), "[^\\p{ASCII}]", "" )'/>

结果什么也没有。

我想要的是gri_gonewiththew00mitc(没有重音符号)。

我使用的语法有问题吗?


仅删除重音符号适用于Unicode字符的一小部分。据我所知,没有标准的拉丁化字符转录方式。(也就是说,每种语言都有不同的方式。) - biziclop
请检查我的答案是否使用了正确的正则表达式语法。 - user357812
4个回答

9

在XSLT / XPath 1.0中,如果您想用非重音的字符替换那些带重音符号的字符,则可以使用translate()函数。

但是,这假定您的“带重音符号的UNICODE字符”不是组合的Unicode字符。 如果是这种情况,您需要使用XPath 2.0 normalize-unicode()函数。

而且,如果真正的目标是拥有有效的URI,则应使用encode-for-uri()

更新:示例

translate('gri_gonéwiththèw00mitc','áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu')

Result: gri_gonewiththew00mitc

encode-for-uri('gri_gonéwiththèw00mitc')

结果:gri_gon%C3%A9withth%C3%A8w00mitc

@biziclop 提供的正确表达建议:

replace(normalize-unicode('gri_gonéwiththèw00mitc','NFKD'),'\P{ASCII}','')

结果: gri_gonewiththew00mitc

注意: 在XPath 2.0中,正确的字符类否定应该使用大写的\P


translate() 假设您列出要替换的所有字符。我猜测 OP 想避免这种情况。虽然我认为一般情况下不可能实现。 - biziclop
@biziclop:我的答案只给出了一个encode-for-uri()函数的链接,这是有原因的。 - user357812
@Alejandro 经过再次考虑,如果你将字符串规范化为NFKD形式,然后丢弃每个非基本ASCII(0-127)字符(你可以使用正则表达式替换),那么你将得到一个无重音的字符串。 - biziclop

3

所以,与我的评论相反,您可以尝试这样做:

replace( normalize-unicode( "öt hűtőházból kértünk színhúst", "NFKD" ), "[^\\p{ASCII}]", "" )

需要注意的是,任何不能被分解且不属于基本ASCII字符集(例如挪威语中的ø或冰岛语中的Þ)都将从字符串中完全删除,但这可能符合您的要求。


好的例子。请检查我的更新,以获取正确的RegExp字符类否定语法。 - user357812
这个RegExp语法示例在哪里?我需要替换一组字符.... ɔ ɛ和一些我甚至无法输入的字符.... 如上所述,使用上面的replace(normalize-unicode())示例从字符串中删除这些组合字符。谢谢 - Boyd

2

之前提到的方法包含了一个名为“ASCII”的未知字符类。根据我的经验,XPath 2.0 可以识别“BasicLatin”这个类,它应该可以达到与“ASCII”相同的效果。

replace(normalize-unicode('Lliç d'Am Oükl Úkřeč', 'NFKD'), '\P{IsBasicLatin}', '')

0

最受欢迎的答案在XPath2.0中不再适用,正如Yuri所提到的。'IsBasicLatin'是ASCII的适当替代品。

下面的代码有效:

replace(normalize-unicode('çgri_gonéwiththèmitç','NFKD'),'\P{IsBasicLatin}','')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接