XPathとXSLTの関数 【文字列関数】 string-length

2004年01月11日(日)更新


string-lengthで文字列の長さを得る

たけち: 今回は、文字列の長さを得るためのstring-length関数について学ぼうね。

さらら: はい。string-lengthって、「文字の長さ」ってそのものを表している名前ね。

たけち: そうだね。じゃ、まず、string-length関数は、どう書くのかをつぎに載せておくね。

  • 書式: 数値 string-length(文字列値)

さらら: 引数として指定した文字列値の長さが、数値として得られるのね。

たけち: そうそう。


原文を含む万葉集データの例

たけち: じゃ、さっそく今回のサンプルを見てみようね。まずは、万葉集のXMLデータ例を次に載せるね。

さらら: いつものとは違うの?

たけち: あっ、いつものとはほとんどいっしょなんだけど・・・(^ ^;

xmlデータ例 【string-length.xml】

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="string-length.xsl"?>

<manyosyu>
<volume no="1">
<poem pno="0008">
    <mkana>熟田津尓船乗世武登月待者潮毛可奈比沼今者許藝乞菜</mkana>
    <poet>額田王(ぬかたのおおきみ)</poet>
    <yomi>熟田津(にきたつ)に、船(ふな)乗りせむと、月待てば、潮もかなひぬ、今は漕(こ)ぎ出(い)でな</yomi>
</poem>
<poem pno="0020">
    <mkana>茜草指武良前野逝標野行野守者不見哉君之袖布流</mkana>
    <poet>額田王(ぬかたのおおきみ)</poet>
    <yomi>茜(あかね)さす、紫野行き標野(しめの)行き、野守(のもり)は見ずや、君が袖振る</yomi>
</poem>
<poem pno="0023">
    <mkana>打麻乎麻續王白水郎有哉射等篭荷四間乃珠藻苅麻須</mkana>
    <poet>作者不明</poet>
    <yomi>打ち麻(そ)を、麻続(をみの)の王(おほきみ)、海人(あま)なれや、伊良虞(いらご)の島の、玉藻(たまも)刈ります</yomi>
</poem>
<poem pno="0024">
    <mkana>空蝉之命乎惜美浪尓所濕伊良虞能嶋之玉藻苅食</mkana>
    <poet>作者不明</poet>
    <yomi>うつせみの、命を惜しみ、波に濡れ、伊良虞(いらご)の島の、玉藻(たまも)刈(か)り食(は)む</yomi>
</poem>
<poem pno="0028">
    <mkana>春過而夏来良之白妙能衣乾有天之香来山</mkana>
    <poet>持統天皇(じとうてんのう)</poet>
<yomi>春過ぎて 夏来たるらし 白妙(しろたえ)の 衣干したり 天(あめ)の香具山(かぐやま)</yomi>
    </poem>
<poem pno="0037">
    <mkana>雖見飽奴吉野乃河之常滑乃絶事無久復還見牟</mkana>
    <poet>柿本人麻呂(かきのもとのひとまろ)</poet>
    <yomi>見れど飽かぬ、吉野の川の、常滑(とこなめ)の、絶ゆることなく、またかへり見む</yomi>
</poem>
</volume>
</manyosyu>

さらら: mkana要素が緑色で書かれているけど、これをどうにかしようとしているの?

たけち: あっ、先に言われちゃったけど、そうなんだ。今回は次のようなスタイルシートを作ろうとしていんるだ。

  • mkana要素の文字列の長さの短い順に表示する

さらら: あ。その「文字列の長さ」を求めるのにstring-lengthを使うのね。

たけち: そうだね。具体的には、(コンテキストノードがpoem要素のとき)次のように書けばいいんだよ。

  • string-length(mkana)

さらら: えぇ、分かるわ。


string-lengthを使ったXSLTスタイルシートの例

たけち: じゃ、さっそく今回のXSLTスタイルシートのサンプルを見てみようね。【string-length.xsl】を次に載せるね。

xslスタイルシート例 【string-length.xsl】

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <html>
    <head>
    <title>たのしいXML: XSLTスタイルシート例(string-length関数)</title>
    <link rel="stylesheet" type="text/css" href="manyo.css" />
    </head>

    <body>
    <p align="center"><font color="navy">万葉集第1巻抜粋: string-length関数で原文の長さを表示</font></p>

    <table border="1" width="600" align="center">
        <tr>
            <th width="15%">歌番号</th>
            <th width="60%">歌の原文(万葉かな)</th>
            <th>原文の文字数</th>
        </tr>

    <xsl:apply-templates select="//poem">
        <xsl:sort select="string-length(mkana)" />
    </xsl:apply-templates>

    </table>
    </body>
    </html>
</xsl:template>

<xsl:template match="poem">
    <tr>
        <td><xsl:value-of select="@pno" /></td>
        <td><xsl:value-of select="mkana" /></td>
        <td><xsl:value-of select="string-length(mkana)" />文字</td>
    </tr>
</xsl:template>

</xsl:stylesheet>

さらら: 2箇所にstring-length関数が使われているわ。

たけち: 最初の
<xsl:sort select="string-length(mkana)" />
は、mkana要素の内容、つまり万葉かなで書かれた原文の文字列の長さの順にソートするために使っているんだね。

さらら: あっ、そうなのね。二つ目の
<xsl:sort select="string-length(mkana)" />
が、その原文の文字列の長さを求めているのね。

たけち: そうなんだね。

たけち: じゃあ、このXSLTスタイルシートを"string-length.xsl"というファイルにして、実際にどうなるか見てみようね。次のテキストをクリックしてみて。

万葉集第1巻抜粋のXMLファイル string-length.xml(上記説明のXML/XSL適用)

string-length関数で原文の長さを求める

さらら: 原文の文字列の長さの順に歌が表示されたわ。

たけち: じゃぁ、今回はこれでおしまい。

さらら: は〜い。ありがと。

→次は、substring関数です。。。 (^ ^;


注)
お気づきの方もいらっしゃるでしょうが、今回の【string-length.xml】では、他のサンプルで使っていた同様のXMLデータと違って、mkana要素の内容に空白文字がありません。空白文字があるときには、今回のサンプルより複雑になりますので、ここでは元のXMLデータの空白を無くしています。空白の処理については、別の項で詳しく学びたいと思いますのでよろしくご容赦ください。