0

我正在尝试使用 xslt 来转换 xml,以便输出可以是用户名。我想放字母“gg_”,然后是名字的第一个字母,然后是整个姓氏。我希望整个字符串都是小写的。我已经成功地能够连接并使用子字符串,但是当我添加小写时,我的代码不起作用。

我尝试了许多不同的组合,并且一直在寻找解决方案,但我无法弄清楚。这个问题似乎与此类似,但我仍然无法让它发挥作用。

XSLT:仅使用 concat 和 substring

<GGUSERNAME><xsl:value-of select="concat('gg_',substring(ww:User/ww:Personal_Data/ww:First_Name,1,1),ww:User/ww:Person_Data/ws:Last_Name)"/></GGUSERNAME>

XSLT 我试过但无法开始工作:

<GGUSERNAME><xsl:value-of select="concat('gg_',substring(lower-case(ww:User/ww:Personal_Data/ww:First_Name),1,1),ww:User/ww:Personal_Data/ww:Last_Name)"/></GGUSERNAME>

<GGUSERNAME><xsl:value-of select="lower-case(concat('gg_',substring(ww:User/ww:Personal_Data/ww:First_Name,1,1),ww:User/ww:Personal_Data/ww:Last_Name))"/></GGUSERNAME>

谢谢!

4

1 回答 1

0

欢迎来到堆栈溢出。

如果您以允许其他人重现问题的形式展示您尝试过的内容,您更有可能对 Stack Overflow 上的问题做出良好的回应。在SO 帮助文件以及 Eric Raymond 和 Rick Moen 的文章How to ask questions the smart way中有关于提出有效问题的好建议。

然而,在这种情况下,解决方案是非常明显的,即使你的困难的性质不是。假设用户的名字和姓氏在变量 $givenname 和 $familyname 中,并且我们已经省略了任何非 ASCII 字符(如果我们分配这种形式的用户 ID,我猜我们正在这样做一种组织,是的),然后

concat('gg_',
       substring($givenname,1,1),
       $familyname)

得到你想要的连接,对于任何 ASCII 字符串,translate($string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')强制小写。将两者结合起来会给你这样的东西:

translate(concat('gg_',
                 substring($givenname,1,1),
                 $familyname),
          'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
          'abcdefghijklmnopqrstuvwxyz')

如果您允许您的用户使用非 ASCII 字符的名称(如果您这样做,那就太棒了)或者用户的名字和姓氏不在我假设的名称的变量中,那么您当然需要对此进行调整。在 XSLT 2.0 中对更大字符集的调整将比在 1.0 中容易得多;在 2.0 中,有一个内置lower-case功能可以大大简化生活。

于 2013-09-02T02:39:31.403 回答