如何使用 XSLT 将所有标题文本转换为标题大小写?

How can I convert all heading text to Title Case with XSLT?

我有一个包含标题列表的 XML 文件,我需要在 XSLT 的帮助下将其更改为标题大小写(单词应以大写字母开头,大多数冠词、连词和介词除外) .

示例: "

对话者

"

对话人物

请帮忙...

谢谢

您可以通过以下方式执行此操作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:variable name="words" select="'*a*,*an*,*the*,*and*,*but*,*for*,*nor*,*or*,*so*,*yet*,*as*,*at*,*by*,*if*,*in*,*of*,*on*,*to*,*with*,*when*,*where*'"/>

    <xsl:template match="/">
        <result>
            <xsl:apply-templates select="document/h1"/>
        </result>
    </xsl:template>

    <xsl:template match="h1">
        <xsl:copy>
            <xsl:variable name="elements" select="tokenize(lower-case(.), ' ')"/>
            <xsl:for-each select="$elements">
                <xsl:choose>
                    <!-- The first letter of the first word of a title is always Uppercase -->
                    <xsl:when test="position()=1">
                        <xsl:value-of select="upper-case(substring(.,1,1))"/>
                        <xsl:value-of select="substring(.,2)"/>
                        <xsl:if test="position()!=last()">
                            <xsl:text> </xsl:text>    
                        </xsl:if>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:choose>
                            <!-- If the word is contained in $words, leave it Lowercase -->
                            <xsl:when test="contains($words,concat('*',.,'*'))">
                                <xsl:value-of select="."/>
                                <xsl:if test="position()!=last()">
                                    <xsl:text> </xsl:text>    
                                </xsl:if>
                            </xsl:when>
                            <!-- If not, first letter is Uppercase -->
                            <xsl:otherwise>
                                <xsl:value-of select="upper-case(substring(.,1,1))"/>
                                <xsl:value-of select="substring(.,2)"/>
                                <xsl:if test="position()!=last()">
                                    <xsl:text> </xsl:text>    
                                </xsl:if>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:otherwise>
                </xsl:choose>
          </xsl:for-each>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/93dFK9m/1