XPathとXSLTの関数 【文字列関数】 substring-after/substring-before

2004年02月08日(日)更新


substring-after/substring-beforeで文字列の一部の文字列を得る

たけち: 今回は、文字列の一部の文字列を得るためのsubstring-after関数substring-before関数について学ぼうね。

さらら: あれ? 文字列の中から文字列を取り出すのは前回のsubstring関数じゃなかったの?

たけち: うん、たしかにそうだね。前回のsubstring関数は、指定した文字列の何文字目から何文字目までの文字列を得るためのものだったね。

さらら: えぇ。

たけち: ここで学ぶsubstring-after関数substring-before関数で、文字列の中の指定した文字の前後の文字列を取ってくるものなんだ。たとえば、ある文字列の":"(コロン)の前の文字列を取りたいとか、","(カンマ)の後ろの文字列を取りたいとか、ね。

さらら: あっ、そうなのね。そういうのって、何文字目か決まっていないことがあるものね。

たけち: そうなんだね。じゃ、まず、substring-after関数とsubstring-before関数は、どう書くのかをつぎに載せておくね。

  • 書式: 文字列値 substring-after(文字列値, 文字列取出し用文字列値)
  • 書式: 文字列値 substring-before(文字列値, 文字列取出し用文字列値)

さらら: 引数として指定した文字列値から、指定した「文字列取出し用文字列値」から後や前の文字列が得られるのね。

たけち: そうそう。そんなに難しくはないよね。substring-after関数で指定した文字列の後ろの文字substring-before関数で指定した文字列の前の文字を取ってくるんだね。

さらら: あっ、「文字列取出し用文字列値」って、一文字じゃなくてもいいのね。

たけち: そうなんだ。


万葉集データの例

たけち: じゃ、さっそく今回のサンプルを見てみようね。まずは、万葉集のXMLデータ例を次に載せるね。前回のsubstringで使ったものとほとんど同じだよ。

さらら: は〜い。

xmlデータ例 【substring2.xml】

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

<manyosyu>
<volume no="1">
<poem pno="0008">
    <poet>額田王(ぬかたのおおきみ)</poet>
    <yomi>熟田津に船乗りせむと月待てば潮もかなひぬ今は漕ぎ出でな</yomi>
</poem>
<poem pno="0020">
    <poet>額田王(ぬかたのおおきみ)</poet>
    <yomi>茜さす紫野行き標野行き野守は見ずや君が袖振る</yomi>
</poem>
<poem pno="0023">
    <poet>不明(ふめい)</poet>
    <yomi>打ち麻を麻続の王海人なれや伊良虞の島の玉藻刈ります</yomi>
</poem>
<poem pno="0024">
    <poet>不明(ふめい)</poet>
    <yomi>うつせみの命を惜しみ波に濡れ伊良虞の島の玉藻刈り食む</yomi>
</poem>
<poem pno="0028">
    <poet>持統天皇(じとうてんのう)</poet>
    <yomi>春過ぎて夏来たるらし白妙の衣干したり天の香具山</yomi>
    </poem>
<poem pno="0037">
    <poet>柿本人麻呂(かきのもとのひとまろ)</poet>
    <yomi>見れど飽かぬ吉野の川の常滑の絶ゆることなくまたかへり見む</yomi>
</poem>
</volume>
</manyosyu>

さらら: 作者と歌が並んでいるわね。これをどうするの?

たけち: 今回は、歌人の漢字とかなを分けて表示してみよう。

  • poet要素の文字列の漢字とかなを分けて表示する

さらら: あっ、分かった。漢字は、"("(かっこ)の前にあるから

  • substring-before(poet, '(')
って書けるね。

たけち: そうだね。じゃあ、「かな」の部分は?

さらら: これも簡単ね。かなは、"("(かっこ)の後にあるから。。。あれ? それだと最後の")"(かっこ)も取れちゃうから、それが残っちゃうわ。こんなときはどうしたらいいの?

たけち: うん。この場合だと、
一度substring-afterで"("(かっこ)の後の文字列を取ってきて、
さらに、substring-beforeで")"(かっこ)の前の文字列を取ってくる
といいよね。

さらら: あっ、なるほど。でも、具体的にはどう書いたらいいのかしら。

たけち: 次のように書けばできるよ。

  • substring-before(substring-after(poet, '('), ')')

さらら: なるほど。分かったわ!!


substring-after/beforeを使ったXSLTスタイルシートの例

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

XSLTスタイルシート例 【substring2.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スタイルシート例(substring-after/substring-before関数)</title>
   <link rel="stylesheet" type="text/css" href="manyo.css" />
   </head>

   <body>
   <p align="center"><font color="navy">万葉集第1巻抜粋: substring-after/before関数で作者名の漢字とかなを分けて表示</font></p>

   <table border="1" width="600" align="center">
      <tr>
         <th width="10%">歌番号</th>
         <th width="15%">作者名</th>
         <th width="20%">さくしゃめい</th>
         <th>歌のよみ</th>
      </tr>

   <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="substring-before(poet, '(')" /></td>
      <td><xsl:value-of select="substring-before(substring-after(poet, '('), ')')" /></td>
      <td><xsl:value-of select="yomi" /></td>
   </tr>
</xsl:template>

</xsl:stylesheet>

さらら: substring-after関数substring-before関数のところはさっき説明してくれた内容そのままね。

たけち: そうだね。

さらら: 実際、どうなるのか早くみてみたいわ。

たけち: じゃあ、このXSLTスタイルシートを"substring2.xsl"というファイルにして、IEで表示してみようね。次のテキストをクリックしてみて。

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

substring-after/before関数で歌人の漢字とかなを分けて表示

さらら: 思ったとおりに表示されたわ。

たけち: よかったね。今回はこれでおしまい。

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

→文字列関数はtranslate関数で終わりです。。。 (^ ^;