特殊情况下的Camel案例转换也在XSLT中

时间:2014-06-24 12:57:53

标签: xslt xslt-1.0 xslt-grouping

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>

1 个答案:

答案 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 &gt; 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 &lt;= 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 &lt;= 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.