XSLT 2.0,替换功能:如何用大写替换匹配组?

时间:2009-01-28 20:39:41

标签: regex xslt xpath replace uppercase

如果我的XSL文件中有以下元素:

<xsl:value-of select="replace(lower-case(@name), '_([a-z0-9])', '$1')" />

例如,来自'get_polygene_lubricants',它会'getpolygenelubricants'。

我想要做的是用'_'替换第一个字母 字母的大写变体。我用Google搜索,阅读文档, 但是我无法在XSLT中找到任何解决方案 更换。

也许有人知道在XSLT 2.0中它是否可行?

3 个答案:

答案 0 :(得分:6)

已修改:根据原始海报的说明,下划线分隔的第一个字符串不应将其首字母大写。

此解决方案不使用递归,应该效率更高

以下是新解决方案

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)
             ),
                        ''
           )

结果现在完全符合要求:

underLinedString

以下是旧解决方案

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)
             ),
            ''
           )

当我们在像这样的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>

并将其应用于此XML文档:

<t>under_lined_String</t>

生成了想要的结果

UnderLinedString

答案 1 :(得分:1)

您可以使用模板执行此操作,以递归方式调用自身来迭代字符串中的字符。此模板应采用位置参数,从1开始 并且每次调用模板都会增加。找到“_”后,使用translate(1.0)或大写(2.0)

将下一个char转换为大写

答案 2 :(得分:0)

虽然已经回答,但这是我的解决方案:

<xsl:template name="camel-case">
  <xsl:param name='value'/>
  <xsl:analyze-string regex="^(.)" select="$value">
    <xsl:matching-substring><xsl:value-of select="upper-case(regex-group(1))"/></xsl:matching-substring>
    <xsl:non-matching-substring>
      <xsl:analyze-string regex="[_-](.)" select=".">
        <xsl:matching-substring><xsl:value-of select="upper-case(regex-group(1))"/></xsl:matching-substring>
        <xsl:non-matching-substring><xsl:value-of select="."/></xsl:non-matching-substring>
      </xsl:analyze-string>
    </xsl:non-matching-substring>          
  </xsl:analyze-string>
</xsl:template>

使用:

<xsl:call-template name="camel-case">
  <xsl:with-param name='value' select="."/>
</xsl:call-template>