在XSL中大写元素名称

时间:2009-12-09 10:40:53

标签: xslt string

我正在编写一个XSL转换,我的源代码有这样的元素 - “title”。目标xml应包含“标题”。有没有办法在XSL中大写字符串的第一个字母?

4 个答案:

答案 0 :(得分:8)

继Johannes所说,要使用 xsl:element 创建一个新元素,你可能会做这样的事情

<xsl:template match="*">
    <xsl:element name="{concat(upper-case(substring(name(), 1, 1)), substring(name(), 2))}">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

如果您使用的是XSLT1.0,则无法使用大写功能。相反,您将不得不使用繁琐的翻译功能

    <xsl:element name="{concat(translate(substring(name(), 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), substring(name(), 2))}">

答案 1 :(得分:2)

Cleaner:使用现有的库:FunctX XSLT http://www.xsltfunctions.com/有一个函数capitalize-first()http://www.xsltfunctions.com/xsl/functx_capitalize-first.html

无需在每个XSLT中重新发明轮子,将lib放在某处并且xsl:包含它。

答案 2 :(得分:1)

我猜你必须手动使用<xsl:element>,然后再使用以下野兽:

concat(upper-case(substring(name(), 1, 1)), substring(name(), 2))

答案 3 :(得分:0)

这是一个纯XLST1模板,可以用ASCII句子创建CamelCase名称。

<xsl:template name="Capitalize">
    <xsl:param name="word" select="''"/>
    <xsl:value-of select="concat(
        translate(substring($word, 1, 1),
            'abcdefghijklmnopqrstuvwxyz',
            'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
        translate(substring($word, 2),
            'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
            'abcdefghijklmnopqrstuvwxyz'))"/>
</xsl:template>
<xsl:template name="CamelCase-recursion">
    <xsl:param name="sentence" select="''"/>
    <xsl:if test="$sentence != ''">
        <xsl:call-template name="Capitalize">
            <xsl:with-param name="word" select="substring-before(concat($sentence, ' '), ' ')"/>
        </xsl:call-template>
        <xsl:call-template name="CamelCase-recursion">
            <xsl:with-param name="sentence" select="substring-after($sentence, ' ')"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>
<xsl:template name="CamelCase">
    <xsl:param name="sentence" select="''"/>
    <xsl:call-template name="CamelCase-recursion">
        <xsl:with-param name="sentence" select="normalize-space(translate($sentence, &quot;:;,'()_&quot;, ' '))"/>
    </xsl:call-template>
</xsl:template>