XSLT下面将每个单词的第一个字符转换为大写字母。但是对于特殊情况(例如:输入 - >狮子,国王输出是>狮子,国王) 。需要特殊情况的解决方案。
<xsl:template name="Split">
<xsl:param name="pText"/>
<xsl:if test="string-length($pText)">
<xsl:variable name="vConvertedWord" select="concat(translate(substring(substring-before(concat($pText,$vSeparator),$vSeparator),1,1), $smallcase,$uppercase),substring(substring-before(concat($pText,$vSeparator),$vSeparator),2))"/>
<xsl:value-of select="$vConvertedWord"/>
<xsl:value-of select="$vSeparator"/>
<xsl:call-template name="Split">
<xsl:with-param name="pText" select="substring-after($pText,$vSeparator)"/>
</xsl:call-template>
</xsl:template>
答案 0 :(得分:0)
我认为你问的是你可能有多个分隔符,不仅仅是空格,还有逗号?也许你想要一些“小”字不要大写?
仅仅为了我自己的个人挑战,我想出的解决方案是一次迭代文本一个字符,建立一个'字',直到你到达'分隔符'。然后你可以将你建立的单词大写,除非它恰好是一个“小”字。然后,您继续使用要构建的新空字段进行迭代。
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="smallcase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:variable name="vSeparator"> ,.</xsl:variable>
<xsl:variable name="vProp"> a an the and </xsl:variable>
<xsl:template match="text()">
<xsl:call-template name="Split">
<xsl:with-param name="pText" select="." />
</xsl:call-template>
</xsl:template>
<xsl:template name="Split">
<xsl:param name="pText"/>
<xsl:param name="letterPos" select="1" />
<xsl:param name="currentWord" select="''" />
<xsl:variable name="nextChar" select="translate(substring($pText, $letterPos, 1), $uppercase ,$smallcase)" />
<xsl:variable name="separatorFound" select="($nextChar = '' or contains($vSeparator, $nextChar))" />
<xsl:if test="$separatorFound">
<xsl:choose>
<xsl:when test="contains($vProp, concat(' ', $currentWord, ' ')) and $letterPos > string-length($currentWord) + 1">
<xsl:value-of select="$currentWord" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="translate(substring($currentWord, 1, 1), $smallcase ,$uppercase)" />
<xsl:value-of select="substring($currentWord, 2, string-length($currentWord) - 1)" />
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$nextChar" />
</xsl:if>
<xsl:variable name="newWord">
<xsl:if test="not($separatorFound)"><xsl:value-of select="concat($currentWord, $nextChar)"/></xsl:if>
</xsl:variable>
<xsl:if test="$letterPos <= string-length($pText)">
<xsl:call-template name="Split">
<xsl:with-param name="pText" select="$pText" />
<xsl:with-param name="letterPos" select="$letterPos + 1" />
<xsl:with-param name="currentWord" select="$newWord" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于此XML
<text>The Lion king, the tiger queen and the hippo prince</text>
以下是输出
The Lion King, the Tiger Queen and the Hippo Prince
编辑 - 替代解决方案
如果您想要大写,
或.
之后出现的字母,请尝试使用此XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="smallcase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:variable name="vSeparator">,.</xsl:variable>
<xsl:variable name="vProp"> a an the and </xsl:variable>
<xsl:template match="text()">
<xsl:call-template name="Split">
<xsl:with-param name="pText" select="." />
</xsl:call-template>
</xsl:template>
<xsl:template name="Split">
<xsl:param name="pText"/>
<xsl:param name="letterPos" select="1" />
<xsl:param name="currentWord" select="''" />
<xsl:param name="startOfBlock" select="1" />
<xsl:variable name="nextChar" select="translate(substring($pText, $letterPos, 1), $uppercase ,$smallcase)" />
<xsl:variable name="separatorFound" select="($nextChar = '' or $nextChar = ' ' or contains($vSeparator, $nextChar))" />
<xsl:if test="$separatorFound">
<xsl:choose>
<xsl:when test="contains($vProp, concat(' ', $currentWord, ' ')) and $startOfBlock = 0">
<xsl:value-of select="$currentWord" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="translate(substring($currentWord, 1, 1), $smallcase ,$uppercase)" />
<xsl:value-of select="substring($currentWord, 2, string-length($currentWord) - 1)" />
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$nextChar" />
</xsl:if>
<xsl:variable name="newWord">
<xsl:if test="not($separatorFound)"><xsl:value-of select="concat($currentWord, $nextChar)"/></xsl:if>
</xsl:variable>
<xsl:variable name="newStartOfBlock">
<xsl:choose>
<xsl:when test="contains($vSeparator, $nextChar)"><xsl:value-of select="1" /></xsl:when>
<xsl:when test="$nextChar = ' ' and $currentWord != ''"><xsl:value-of select="0" /></xsl:when>
<xsl:otherwise><xsl:value-of select="$startOfBlock" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$letterPos <= string-length($pText)">
<xsl:call-template name="Split">
<xsl:with-param name="pText" select="$pText" />
<xsl:with-param name="letterPos" select="$letterPos + 1" />
<xsl:with-param name="currentWord" select="$newWord" />
<xsl:with-param name="startOfBlock" select="$newStartOfBlock" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于此XML
<text>The Lion king, the tiger queen and the hippo prince.... And cats, bats and rats.</text>
以下是输出:
The Lion King, The Tiger Queen and the Hippo Prince.... And Cats, Bats and Rats.