我一直在寻找,但是对于字符来说,找不到相当于“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
(无口音)
我使用的语法错了吗?
答案 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}','')