@NavinRawat から提供された回答に便乗して、XSLT 1.0 バリアントを次に示します。関数を使用する必要があることに注意してください。EXSLT Extension Library's
node-set()
この XSLT の場合:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pConjunctions" select="'|OF|TO|AND|THE|'"/>
<xsl:variable name="vUppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:template match="/*/*/*/title">
<xsl:variable name="vTitleWords">
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="delimiter" select="' '"/>
</xsl:call-template>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($vTitleWords)/*"/>
</xsl:template>
<xsl:template match="token">
<xsl:if test="position() > 1"> </xsl:if>
<xsl:choose>
<xsl:when test="contains($pConjunctions, concat('|', ., '|'))">
<xsl:value-of select="translate(., $vUppercase, $vLowercase)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select="concat(
substring(., 1, 1),
translate(substring(., 2), $vUppercase, $vLowercase)
)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()"/>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:choose>
<xsl:when test="contains($text,$delimiter)">
<xsl:element name="token">
<xsl:value-of select="substring-before($text,$delimiter)"/>
</xsl:element>
<xsl:call-template name="tokenize">
<xsl:with-param
name="text"
select="substring-after($text,$delimiter)"/>
<xsl:with-param
name="delimiter"
select="$delimiter"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$text">
<xsl:element name="token">
<xsl:value-of select="$text"/>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
...提供された XML に対して実行されます。
<?xml version="1.0" encoding="UTF-8"?>
<chapter num="A">
<title>
<content-style font-style="bold">PART 1 GENERAL PRINCIPLES</content-style>
</title>
<section level="sect1">
<section level="sect2" number-type="manual" num="1.">
<title>INTRODUCTION OF INDIA TO NEW ERA AND THE EXISTING</title>
</section>
</section>
</chapter>
...必要な結果が生成されます。
Introduction of India to New Era and the Existing
明らかに、XSLT 2.0 バリアントははるかにクリーンで、2 パス変換を必要としませんが、XSLT 1.0 に行き詰まっていて EXSLT を利用できる場合は、これで目的の場所に移動できます。