根据字符串位置转换为驼峰案例

时间:2015-01-13 08:18:57

标签: xslt xslt-2.0

我是以下的XML。

<title>1. IN AGENTS IN GENERAL</title>

我试图将此转换为驼峰式案例,如果有一组单词,如果它们发生,则必须将其更改为小写。但条件是if these words come in starting, they have to be changed into camel case, else lower case

我的XSL是

<xsl:template match="title">
<xsl:apply-templates/>
</xsl:template>    
<xsl:template match="title/page"/>

   <xsl:param name="Conjunction">^(of|to|and|the|for|on|or|an|as|by|of|it|between|with|in|into|on|onto|here|a)$</xsl:param>

<xsl:template match="title/text()">
    <xsl:analyze-string select="." regex="(\w)(\w*)">
      <xsl:matching-substring>
        <xsl:value-of
          select="if (matches(., $Conjunction, 'i'))
                  then lower-case(.)
                  else concat(upper-case(regex-group(1)), lower-case(regex-group(2)))"/>
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <xsl:value-of select="."/>
      </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:template>

并根据输入,预期输出应为

1. In Agents in General

但是得到的是

1. in Agents in General

这是工作演示。 DEmo

请让我知道如何完成这项工作。

由于

2 个答案:

答案 0 :(得分:2)

如果你可以假设一个句号分隔每个句子,并且你希望每个句子的第一个单词都是大写的,你可以通过句号来标记文本...

<xsl:for-each select="tokenize(., '\.')">

然后分别在每个部分上应用正则表达式,但是检查匹配子字符串中的位置,以便它不会将第一个匹配转换为小写。

试试这个模板

<xsl:template match="title/text()">
    <xsl:for-each select="tokenize(., '\.')">
        <xsl:if test="position() > 1">.</xsl:if>
        <xsl:analyze-string select="." regex="(\w)(\w*)">
            <xsl:matching-substring>
                <xsl:value-of
              select="if (matches(., $Conjunction, 'i') and position() > 2)
                      then lower-case(.)
                      else concat(upper-case(regex-group(1)), lower-case(regex-group(2)))"/>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:for-each>
</xsl:template>

答案 1 :(得分:0)

在您当前的代码中,尝试更改:

<xsl:value-of select="if (matches(., $Conjunction, 'i'))

<xsl:value-of select="if (matches(., $Conjunction, 'i') and position() != 3)