如何从XSL中的字符中去除重音?

时间:2011-03-22 21:35:43

标签: xml xslt unicode character-encoding

我一直在寻找,但是对于字符来说,找不到相当于“normalize-space”的XSL函数。也就是说,我的内容重写了UNICODE字符,这很棒,但是根据这些内容,我正在创建一个文件名,我不想要那些重音符号。

那么,有什么东西我可以忽略或不用Google搜索来轻松处理角色吗?

在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(无口音)

我使用的语法错了吗?

4 个答案:

答案 0 :(得分:6)

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

但是,假设您的“重音UNICODE字符”不是由unicode字符组成的。如果是这种情况,则需要使用XPath 2.0 normalize-unicode()函数。

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

更新:示例

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

结果: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

答案 1 :(得分:3)

所以,与我的评论相反,你可以试试这个:

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

虽然警告说任何不能分解且不是基本ASCII(例如挪威语ø或冰岛语Þ)的字符都将从字符串中完全删除,但这可能没问题满足您的要求。

答案 2 :(得分:1)

之前建议的方法包含名为'ASCII'的unknownthe字符类。根据我的经验,XPath 2.0识别出类'BasicLatin',它应该与'ASCII'的目的相同。

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

答案 3 :(得分:0)

Yuri提到,投票最多的答案不再适用XPath2.0。 'IsBasicLatin'是ASCII的适当替代

以下代码有效:

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