2016-10-21 32 views
0

私はXSLTを初めて使用しています。私はいくつかの助けが必要です。 私はXMLファイルに格納されたデータを持っており、一つの属性があります:文字列の最初の文字をxsltの大文字に変換する

<clientName>JOHN GEORGE SMITH</clientName> 

は、次のように私は私のHTMLファイルでこの名前を印刷しています:ジョン・ジョージ:

<div> 
    <xsl:value-of select="clientName"/> 
</div> 

は、私は私の出力になりたいですSmith

最初の文字を各単語の大文字にします。私は解決策をオンラインで見つけようとしましたが、適切な方法を見つけることができませんでした。

ありがとうございます。

+0

プロセッサがXSLT 2.0をサポートしていますか? –

+0

わかりません。私はXSLT 1.0を使用しています –

答えて

2

ここでの本当の問題は、各単語をどのように大文字にするのかということではなく、与えられたテキストを個々の単語にトークン化する方法です。

言葉は常にスペースで区切られていることを仮定することができる場合 - あるいは少なくともスペースで終わる文字列で - あなたは、このようにそれを行うことができます:

<xsl:template match="something"> 

    <!-- some stuff --> 

    <div> 
     <xsl:call-template name="capitalize"> 
      <xsl:with-param name="text" select="clientName"/> 
     </xsl:call-template> 
    </div> 

    <!-- other stuff --> 

</xsl:template> 


<xsl:template name="capitalize"> 
    <xsl:param name="text"/> 
    <xsl:param name="delimiter" select="' '"/> 

    <xsl:variable name="upper-case" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
    <xsl:variable name="lower-case" select="'abcdefghijklmnopqrstuvwxyz'"/> 

    <xsl:variable name="word" select="substring-before(concat($text, $delimiter), $delimiter)" /> 
    <xsl:if test="$word"> 
     <xsl:value-of select="translate(substring($word, 1, 1), $lower-case, $upper-case)"/>  
     <xsl:value-of select="translate(substring($word, 2), $upper-case, $lower-case)"/> 
     </xsl:if> 
    <xsl:if test="contains($text, $delimiter)"> 
     <xsl:value-of select="$delimiter"/> 
     <!-- recursive call --> 
     <xsl:call-template name="capitalize"> 
      <xsl:with-param name="text" select="substring-after($text, $delimiter)"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

。なお、これは、次のような値で失敗します。

<clientName>HILLARY RODHAM-CLINTON</clientName> 
<clientName>HILLARY (RODHAM) CLINTON</clientName> 
<clientName>GEORGE BUSH THE THIRD</clientName> 
<clientName>CHARLES DE GAULLE</clientName> 
<clientName>RENÉE ZELLWEGER</clientName> 

など、おそらく私は今考えることができません。

+0

これはうまくいきました。あなたがコードを書いた方法は自明です。どうもありがとう! –

+0

3位、4位、5位で失敗しませんでした。なぜそれが失敗すると思いましたか? –

+0

3) "the"の代わりに "The"; 4) "de"の代わりに "De"; 5) "Renée"の代わりに "Renée"(私はこれをより良い例に変更しました)。 –

関連する問題