我是以下的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
请让我知道如何完成这项工作。
由于
答案 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)