【问题标题】:Converting first letter of a string to capital in xslt在xslt中将字符串的第一个字母转换为大写
【发布时间】:2016-10-21 22:56:42
【问题描述】:

我是 XSLT 的新手,我需要一些帮助。 我将数据存储在 XML 文件中,并且有一个属性:

<clientName>JOHN GEORGE SMITH</clientName> 

我在我的 HTML 文件中打印此名称,如下所示:

<div>
    <xsl:value-of select="clientName"/>
</div>

我希望我的输出是:John George Smith

我希望每个单词的第一个字母大写。我尝试在网上找到解决方案,但找不到合适的方法。

提前致谢。

【问题讨论】:

  • 您的处理器是否支持 XSLT 2.0?
  • 我不确定。我正在使用 XSLT 1.0

标签: html xslt


【解决方案1】:

这里真正的问题不是如何将每个单词大写,而是如何将给定文本标记为单个单词。

如果可以假设单词总是由空格分隔 - 或至少由以空格结尾的字符串分隔 - 那么您可以这样做:

<xsl:template match="something">

    <!-- some stuff -->

    <div>
        <xsl:call-template name="capitalize">
            <xsl:with-param name="text" select="clientName"/>
        </xsl:call-template>
    </div>

    <!-- other stuff -->

</xsl:template>


<xsl:template name="capitalize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="' '"/>

    <xsl:variable name="upper-case" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
    <xsl:variable name="lower-case" select="'abcdefghijklmnopqrstuvwxyz'"/>

    <xsl:variable name="word" select="substring-before(concat($text, $delimiter), $delimiter)" />
    <xsl:value-of select="translate(substring($word, 1, 1), $lower-case, $upper-case)"/>    
    <xsl:value-of select="translate(substring($word, 2), $upper-case, $lower-case)"/>
    <xsl:if test="contains($text, $delimiter)">
        <xsl:value-of select="$delimiter"/>
        <!-- recursive call -->
        <xsl:call-template name="capitalize">
            <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

请注意,这将因以下值而失败:

<clientName>HILLARY RODHAM-CLINTON</clientName>
<clientName>HILLARY (RODHAM) CLINTON</clientName>
<clientName>GEORGE BUSH THE THIRD</clientName>
<clientName>CHARLES DE GAULLE</clientName>
<clientName>RENÉE ZELLWEGER</clientName>

可能还有其他我现在想不起来的人。

【讨论】:

  • 这行得通,而且您编写代码的方式是不言自明的。非常感谢!
  • 在第 3、第 4 和第 5 种情况下都没有失败。你为什么认为它会失败?
  • 3) 用“The”代替“the”; 4)“德”而不是“德”; 5)“RenÉe”而不是“Renée”(我把它改成了一个更好的例子)。
  • 我再次检查,仅在前两种情况下失败。
  • 在第 4 种情况下,您没有得到“Charles De Gaulle”吗?正确的结果是“戴高乐”。这是一个与 XSLT 无关的难题。在某些情况下,无法恢复原来的拼写:如果您输入的是“MACKENZIE”,您无法判断他们的真实姓名是“MacKenzie”还是“Mackenzie”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多