【问题标题】:How do I strip accents from characters in XSL?如何从 XSL 中的字符中去除重音符号?
【发布时间】:2011-07-20 20:47:36
【问题描述】:

我一直在寻找,但找不到与字符“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 字符。据我所知,没有标准的拉丁化字符转录方式。 (也就是说,每种语言都有不同的语言。)
  • 检查我的答案以获得正确的正则表达式语法。

标签: xml xslt unicode character-encoding


【解决方案1】:

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

以下代码有效:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在 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

      【讨论】:

      • translate() 假定您列出了所有要替换的字符。我的猜测是 OP 想要避免这种情况。虽然我认为一般来说不可能。
      • @biziclop:我的回答只有一个指向encode-for-uri()函数的链接是有原因的。
      • @Alejandro 再想一想,如果您将字符串规范化为 NFKD 形式,然后丢弃每个非基本 ASCII (0-127) 字符(您可以使用正则表达式替换),您将得到一个没有重音的字符串。
      【解决方案4】:

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

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

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

      【讨论】:

      • 很好的例子。请检查我的更新以获取正确的 RegExp 字符类否定语法。
      猜你喜欢
      • 2010-09-19
      • 2012-12-10
      • 2015-08-30
      • 2012-01-01
      • 1970-01-01
      • 2010-11-04
      • 2019-01-09
      • 2012-03-30
      相关资源
      最近更新 更多