XSLT2.0大写第一个正则表达式匹配函

时间:2013-05-14 19:41:42

标签: regex xslt-2.0

我有一个用例将xml文档中的camelCase元素转换为NewCase,如下所示:

电流:

<firstName>John</firstName>
<lastName>Smith</lastName>
<userId>5692</userId>

所需:

<FirstName>John</FirstName>
<LastName>Smith</LastName>
<UserId>5692</UserId>

我必须通过XSLT来促进这一点。为了做到这一点,我确定了一个正则表达式,可以捕获camelCase以满足我的要求:

\b([a-z])([a-z]*[A-Z][a-z]*)\b

从那里开始,我一直试图通过使用替换函数来通过XSLT2.0来实现这个目的:

 replace($xmlToParse,"\b([a-z])([a-z]*[A-Z][a-z]*)\b","REPLACED")

对于最后一个块,我想取匹配的正则表达式的第一段(在lowerCase中,基于上面的正则表达式,段将是'l'和'owercase'),并使用大写函数来改变它第一段/大写字母(所以lowerCase是LowerCase),并为XML中的每个正则表达式匹配执行此操作。不幸的是到目前为止我一直无法实现它。

是否有人能够提供有关如何将它们全部链接在一起的任何见解?

1 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "*[matches(name(), '[a-z]+[A-Z][a-z]*')]">
  <xsl:element name=
   "{upper-case(substring(name(),1,1))}{substring(name(),2)}">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML片段(包装到单个顶部元素中以成为格式良好的XML文档):

<t>
    <firstName>John</firstName>
    <lastName>Smith</lastName>
    <userId>5692</userId>
</t>

会产生想要的正确结果:

<t>
      <FirstName>John</FirstName>
      <LastName>Smith</LastName>
      <UserId>5692</UserId>
</t>