XPathとXSLTの関数 【文字列関数】 contains

2004年01月18日(日)更新


containsで文字列をチェック

たけち: 今回は xsl:ifに関係があることをやるね。テキストの内容によって表示を変えよう その-2 xsl:ifってところでさららの歌だけを表示したよね。

さらら: そうだったわね。私の歌かどうかをxsl:ifで調べたわよね。

  • <xsl:if test="作者[.= '持統天皇(じとうてんのう)']">

たけち: そうなんだけど、ちょっと長いよね。それに、もっと長いテキストを調べるのにいちいち全部を書いていられないよね。

さらら: そういわれればそうね。。。。。あっ、もっといい方法があるのね、そうなんでしょ!?

たけち: そうなんだ。containsを使うともう少し簡単に調べられるよ。

さらら: じゃあ、今回はcontains、というわけね。

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

  • 書式: 論理値 contains("文字列1", "文字列2")

さらら: "文字列1"と"文字列2"があるけど、どっちがどうなの?

たけち: "文字列1"に"文字列2"が含まれているかどうかを調べて、その結果を論理値として返すんだ。

さらら: ふ〜ん。論理値って真か偽かって、あれね。

たけち: そうそう。で、"文字列1"に"文字列2"が含まれている場合には"true"(真)を、含まれていない場合には"false"(偽)を返すんだね。
ちなみに、"文字列2"が空文字列の場合は "true"(真)を返すんだ。


test="contains(poet, '持統')"

さらら: も少し具体的に説明してくれない?

たけち: あっ、そうだね。。。。じゃぁ、図で例を説明するね。

containsの説明図

たけち: 図でわかるように、containsでは、指定した文字列があるか無いかがわかるんだね。

さらら: あっ、そういうことなのね。。。。わかったわ、前のサンプルだと全部の文字列を指定していたけど、containsを使うと、これだけ調べれば大丈夫だという「文字列」を指定すればいいのね!!

たけち: そうそう。きっと、もう分かったね。じゃぁ、今回のサンプルを見てみよう。contains関数を使っている以外はconcat関数でのサンプルとほぼ同じだからね。

xmlデータ

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="contains.xsl"?>
<manyosyu>
  <poem url="m0007.html" pno="7">
    <mkana>金野乃 美草苅葺 屋杼礼里之 兎道乃宮子能 借五百礒所念</mkana>
    <poet>額田王(ぬかたのおおきみ)</poet>
    <yomi>秋の野の、み草刈り葺(ふ)き、宿れりし、宇治の宮処(みやこ)の、仮(かり)廬(いほ)し思ほゆ</yomi>
    <image>image/m0007.jpg</image>
    <mean>秋の野のみ草を刈って屋根を葺(ふ)いて、泊まった宇治(うじ)の宮処(みやこ)の仮の宿のことを思い出します。</mean>
    </poem>

・・・・・途中省略してます・・・・・

  <poem url="m0037.html" pno="37">
    <mkana>雖見飽奴 吉野乃河之 常滑乃 絶事無久 復還見牟</mkana>
    <poet>柿本人麻呂(かきのもとのひとまろ)</poet>
    <yomi>見れど飽かぬ、吉野の川の、常滑(とこなめ)の、絶ゆることなく、またかへり見む
    </yomi>
    <image>image/m0037.jpg</image>
    <mean>何度見ても飽きることの無い吉野の川の常滑(とこなめ)のように、絶えること無く何度も何度も見にきましょう。</mean>
  </poem>

</manyosyu>

xsl:ifの説明図

XSLTスタイルシート

<?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: XSLサンプル</title>
  <link rel="stylesheet" type="text/css" href="manyo.css" />
  </head>

  <body>
  <p align="center">万葉集第1巻抜粋: containsで文字列を調べる</p>

  <xsl:apply-templates />

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

<xsl:template match="poem">

<xsl:if test="contains(poet, '持統')">

<table border="0" width="500" align="center">
  <tr>
  <th>
  <a><xsl:attribute name="href">http://www6.airnet.ne.jp/manyo/main/one/<xsl:value-of select="@url" /></xsl:attribute>歌番号: <xsl:value-of select="@pno" /></a>
  </th>
  <th><xsl:value-of select="poet" />の歌</th>
  </tr>
  <tr>
  <td colspan="2">読み: <xsl:value-of select="yomi" /></td>
  </tr>
  <tr>
  <td><xsl:value-of select="mean" /></td>
  <td>
    <img><xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute></img>
  </td>
  </tr>
</table>

</xsl:if>

</xsl:template>

</xsl:stylesheet>

さらら: あれっ? 最初の図での説明のときにはcontainsの中は、"(ダブルコーテーション)だったのに、このXSLTスタイルシートでは、'(シングルコーテーション)になっているけど・・・・

たけち: あっ、これはね、test=の右側に書く内容が"(ダブルコーテーション)で囲まれるから、その中のcontainsの指定に'(シングルコーテーション)を使っているんだ。

さらら: あっ、そうなのね。

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

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

poetに「持統」が含まれる歌を表示

さらら: あっ、出た出た!! containsを使うと、ある文字列1に、指定した文字列2があるかどうかを調べるのに便利ね。

たけち: うん。そうだよね。じゃぁ、今回はこれでおしまい。

さらら: はい。ありがと。 (*^ ^*)

→次はformat-numberです。。。。。 (^ ^;