我正在编写一个XSL转换,我的源代码有这样的元素 - “title”。目标xml应包含“标题”。有没有办法在XSL中大写字符串的第一个字母?
答案 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, ":;,'()_", ' '))"/>
</xsl:call-template>
</xsl:template>