【问题标题】:Lowercase conversion in XSLXSL 中的小写转换
【发布时间】:2011-03-04 11:42:11
【问题描述】:

我有一个类似的 XML

<emps>
<emp id='3432'>
 <fname>Jack</fname>
 <lname>Dawson</lname>
<emp>
<emp id='1122'>
 <fname>Jack</fname>
 <lname>Thompson</lname>
<emp>
<emps>

我正在开发一个 Web 应用程序,它根据输入的名字搜索这个 xml 并提供一个结果页面。为此,我编写了一个 xslt 来根据输入搜索字符串将 XML 转换为 HTML,该输入搜索字符串作为名为 srchStr 的变量传递。

<xsl:template match="employees">
  <xsl:for-each select="emp[fname=$srchStr]">
<tr>
   <xsl:variable name="id">
    <xsl:value-of select="@id" />
   </xsl:variable>
   <td>
    <a href='detailSearch.do?id={$id}'>
     <xsl:value-of select="fname" />
     ,
     <xsl:value-of select="lname" />
    </a>
   </td>

  </tr>
</xsl:for-each
</xsl:template>

但用户可以输入大写或小写的名称。那么如何将 xml 标签 fname 中的名字转换为小写并进行比较呢?

有人可以在我的 xsl 中输入一个代码 sn-p 以使用 fn:lower-case

【问题讨论】:

标签: xslt lowercase


【解决方案1】:

要将字符串转换为小写或大写,您可以使用 XPath 1.0 函数translate

首先为小写和大写字母定义您的字母。注意每对字符的位置需要相同:

<xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>

然后就可以转换成大写了:

<xsl:value-of select="translate($toconvert,$lcletters,$ucletters)"/>

或小写

<xsl:value-of select="translate($toconvert,$ucletters,$lcletters)"/>

【讨论】:

  • 这在小写字母和大写字母之间没有一对一映射时不起作用。德语 ettsett (ß) 完全是小写字母,大写字母是“SS”。 (两个“S”字母。)考虑到 Unicode 字母的数量,以及即使是仅限美国的网站/服务遇到姓名中带有重音符号的人的可能性,除非您只关心姓名的英国国教拼写,否则这是一个不可行的解决方案.
  • @yam655:确实,使用这种方法将单个字符转换为两个字符是行不通的。一个选项可能是添加到 2008 年添加的 LATIN CAPITAL LETTER SHARP S Unicode 代码字符 (U+1E9E) 的映射。顺便说一下,重音字符可以使用,它们只需要在列表中作为 Tomalak指出。但毕竟,XSLT/XPath 1.0 是一个非常有限的平台,我当然会推荐使用对 I18N 有良好支持的专用库进行大小写转换。
  • 这只是展示了 translate() 方法的问题。一旦你处理了非英语语言,你就会开始对语言相同的事物进行多个映射。在德语中,“ß”应该与“ss”比较,但人们可以猜到。更大的问题来自重音字母,您可能会在基本字母的顶部而不是单个代码点上出现一组非高级重音。 ('Ê' 与非高级'^' 和标准'E' 等)我同意,最好使用具有明确I18N 支持的库。 IMO,应该避免 translate()。
【解决方案2】:

emp[lower-case(fname)=lower-case($srchStr)]

或者,如果您只有 XPath 1.0,您可以尝试使用如下所示的翻译: http://geekswithblogs.net/TimH/archive/2006/07/06/84229.aspx

请注意,translate 的示例不适用于带有重音符号的名称(例如我的 :)

【讨论】:

  • translate() 适用于重音字符。他们只需要在列表中。
  • 和@Tomalak:谢谢你们俩的帮助!
猜你喜欢
  • 2012-05-24
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2017-08-29
  • 2016-02-12
  • 1970-01-01
相关资源
最近更新 更多