Din*_*108 11 xml title-case xslt xslt-1.0
我有一个字符串,我需要将每个单词的第一个字母转换为大写字母,然后使用xsl将其转换为小写字母,例如,
输入字符串= dInEsh sAchdeV kApil Muk
期望的输出字符串= Dinesh Sachdev Kapil Muk
虽然,我知道我必须使用翻译功能,但我怎样才能将每个单词的第一个章程翻译成大写字母,并使用XSLT 1.0将所有单词翻译成小写字母
谢谢
fre*_*ler 14
以下不是"好",我确信有人(主要是Dimitri)可以提出更简单的东西(特别是在XSLT 2.0中)......但我已经测试了这个并且它有效
<xsl:template name="CamelCase">
<xsl:param name="text"/>
<xsl:choose>
<xsl:when test="contains($text,' ')">
<xsl:call-template name="CamelCaseWord">
<xsl:with-param name="text" select="substring-before($text,' ')"/>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:call-template name="CamelCase">
<xsl:with-param name="text" select="substring-after($text,' ')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="CamelCaseWord">
<xsl:with-param name="text" select="$text"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="CamelCaseWord">
<xsl:param name="text"/>
<xsl:value-of select="translate(substring($text,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')" /><xsl:value-of select="translate(substring($text,2,string-length($text)-1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
基本的想法是你调用CamelCase,如果它找到一个空格,那么它会在空格之前的CamelCaseWord所有内容上运行(即第一个单词),然后再次调用空格之后的所有内容(即句子的其余部分).否则,如果没有找到空格(因为它已经到了句子中的最后一个单词),那么它只是调用.CamelCaseCamelCaseWord
该CamelCaseWord模板只是将第一个字符从下部转换为上部(如有必要),将所有剩余字符从上部转换为下部(如有必要).
所以称之为你...
<xsl:call-template name="CamelCase">
<xsl:with-param name="text">dInEsh sAchdeV kApil Muk</xsl:with-param>
</xsl:call-template>
Run Code Online (Sandbox Code Playgroud)
额外:
我错过了问题中的1.0要求。这仅适用于2.0版。
下面是原始答案。
我相信这个人对我有用。声明一个函数:
<xsl:function name="my:titleCase" as="xs:string">
<xsl:param name="s" as="xs:string"/>
<xsl:choose>
<xsl:when test="lower-case($s)=('and','or')">
<xsl:value-of select="lower-case($s)"/>
</xsl:when>
<xsl:when test="$s=upper-case($s)">
<xsl:value-of select="$s"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(upper-case(substring($s, 1, 1)), lower-case(substring($s, 2)))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
Run Code Online (Sandbox Code Playgroud)
并使用它:
<xsl:sequence select="string-join(for $x in tokenize($text,'\s') return my:titleCase($x),' ')"/>
Run Code Online (Sandbox Code Playgroud)
归功于samjudson => http://p2p.wrox.com/xslt/80938-title-case-string.html
| 归档时间: |
|
| 查看次数: |
16542 次 |
| 最近记录: |