XPathとXSLTの関数 【文字列関数】 starts-with

2004年03月14日(日)更新


starts-withで文字列が指定した文字列で始まっているかどうかを知る

たけち: 今回は、文字列が指定した文字列で始まっているのかどうかを知るためのstarts-with関数について学ぼうね。

さらら: ということは、指定した文字列で始まっている歌だけを取り出したりできるのね。

たけち: そう、そうなんだね。じゃ、いつものように、starts-with関数は、どう書くのかをつぎに載せておくね。

  • 書式: 論理値 starts-with(文字列値-1, 文字列値-2)

さらら: どっちがどっちなの?

たけち: "文字列1-"が"文字列-2"で始まっているかどうかを調べて、"文字列1-"が"文字列-2"で始まっているときに"true"が返るんだ。そうでないときは、"false"が返るんだよ。

さらら: そうなのね。


万葉集データの例

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

さらら: は〜い。

xmlデータ例 【starts-with.xml】

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="starts-with.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要素の文字列が"額田王"で始まっている歌を表示する

さらら: あ。その"額田王"で始まっているかどうかを調べるのにstarts-withを使うのね。

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

  • starts-with(poet, '額田王')

さらら: うんうん。


starts-withを使ったXSLTスタイルシートの例

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

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

  <body>
  <p align="center"><font color="navy">万葉集第1巻抜粋: starts-with関数で額田王の歌かどうかを調べる</font><br /><font color="red">額田王の歌だけを表示します</font></p>

  <table border="0" width="500" align="center">
    <tr>
      <th width="15%">歌番号</th>
      <th width="60%">歌のよみ</th>
      <th>イメージ</th>
    </tr>

  <xsl:apply-templates />

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

<xsl:template match="poem">
  <xsl:if test="starts-with(poet, '額田王')">
    <tr>
      <td><xsl:value-of select="@pno" /></td>
      <td><xsl:value-of select="yomi" /></td>
      <td><img><xsl:attribute name="src"><xsl:value-of select="concat('image/m', @pno, '.jpg')" /></xsl:attribute></img></td>
    </tr>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>

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

たけち: そうだね。簡単だよね。

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

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

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

starts-with関数で額田王の歌かどうかを調べる

さらら: 思ったとおりに、額田王の歌だけが表示されたわ。

たけち: 思ったとおりに表示できるとうれしいよね。今回はこれでおしまい。

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

→さらに文字列関数についての学習は続きます。。。 (^ ^;