Jag*_*ger 2 regex xslt xpath replace uppercase
如果我的XSL文件中有以下元素:
<xsl:value-of select="replace(lower-case(@name), '_([a-z0-9])', '$1')" />
Run Code Online (Sandbox Code Playgroud)
例如,来自'get_polygene_lubricants'的'getpolygenelubricants'.
我想要做的是将'_'后的第一个字母替换为字母的大写变体.我用谷歌搜索,阅读文档,但我无法在XSLT中找到任何解决方案来进行简单的替换.
也许有人知道XSLT 2.0是否可行?
编辑:根据原始海报的说明,由下划线分隔的第一个字符串不应该将其首字母大写.
此解决方案不使用递归,应该更有效.
这是新的解决方案:
string-join(
(for $i in 1 to count(tokenize(.,'_')),
$s in tokenize(.,'_')[$i],
$fl in substring($s,1,1),
$tail in substring($s,2)
return
if($i eq 1)
then $s
else concat(upper-case($fl), $tail)
),
''
)
Run Code Online (Sandbox Code Playgroud)
结果现在完全符合要求:
underLinedString
Run Code Online (Sandbox Code Playgroud)
以下是旧解决方案.
replace()函数假设您有一个固定的替换 - 因此它不是解决此问题的最佳工具.
这是一个单行的XPath 2.0解决方案(当然它可以用作XSLT 2.0转换的一部分:)):
string-join(
(for $s in tokenize(.,'_'),
$fl in substring($s,1,1),
$tail in substring($s,2)
return
concat(upper-case($fl), $tail)
),
''
)
Run Code Online (Sandbox Code Playgroud)
当我们在XSLT 2.0转换中使用上面的表达式时,如下所示:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:sequence select=
"string-join(
(for $s in tokenize(.,'_'),
$fl in substring($s,1,1),
$tail in substring($s,2)
return
concat(upper-case($fl), $tail)
),
''
)
"/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
并将其应用于此XML文档:
<t>under_lined_String</t>
Run Code Online (Sandbox Code Playgroud)
产生了想要的结果:
UnderLinedString
Run Code Online (Sandbox Code Playgroud)