2011-03-22 123 views
4

我一直在寻找,但找不到相当于“normalize-space”的字符的XSL函数。也就是说,我的内容具有重音UNICODE字符,这很好,但是从内容来看,我创建了一个文件名,我不想要那些重音。如何从XSL中的字符中去除重音符号?

那么,有没有什么我可以忽略,或不正确地使用谷歌搜索,轻松处理字符?

在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

我使用的语法错误(没有口音)?

+0

删除重音只适用于一小部分的Unicode字符。据我所知,没有标准的拉丁化字符转录方式。 (也就是说,每种语言都有一个不同的)。 – biziclop 2011-03-22 21:50:44

+0

请检查我的答案是否有正确的RegExp语法。 – 2011-03-24 02:59:47

回答

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

+0

'translate()'假定你列出了你想要替换的所有字符。我的猜测是OP想要避免这种情况。尽管我不认为这是可能的。 – biziclop 2011-03-22 21:59:56

+0

@biziclop:我的答案只有一个链接到'encode-for-uri()'函数是有原因的。 – 2011-03-22 22:07:55

+0

@Alejandro第二个想法是,如果将字符串规范化为NFKD形式,然后丢弃每个非基本ASCII(0-127)字符(可以使用正则表达式替换),您将得到一个不带重音的字符串。 – biziclop 2011-03-22 22:38:46

3

所以,违背了我的意见,你可以试试这个:

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

虽然被警告,不能被分解,没有基本的ASCII任何字符(挪威ø或冰岛Þ为例)将完全从字符串中删除,但这可能与您的要求相符。

+0

很好的例子。请检查我的更新是否有正确的RegExp字符类否定语法。 – 2011-03-24 02:59:01

1

先前建议的方式包含未知的名为'ASCII'的字符类。根据我的经验,XPath 2.0可以识别类BasicLatin,它的用途与'ASCII'相同。

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