ページ 1 / 1

ファイルの拡張子で表示を振り分ける

Posted: 2005年9月30日(金) 00:43
by kem
もうひとつ質問です。XMLがわかっていないので、初歩的な質問でしたらごめんなさいです。

file項目によってアップロードしたファイルをデザイン定義で拡張子によって表示をわけたいのです。
具体的にはPDFやTEXTなどファイル種別によって異なるアイコンをつけたいということです。

リファレンスを見て条件によって処理を変える方法はわかるのですが、条件文を拡張子に対応したものにする方法がわかりません。正規表現を書けばいいのでしょうか。

ご教示いただけたら幸いです。

Re: ファイルの拡張子で表示を振り分ける

Posted: 2005年9月30日(金) 10:28
by webmaster
 webmasterです。
 kemさん、ご質問ありがとうございます。

 そのご要望は、XSLT側でちょっとプログラミング的な工夫が必要になります。
 概要としては、「ファイルの最後の3文字を取り出して、"pdf"か?"txt"か?などを
判定する」という方法になります。

 「ファイルの最後の3文字を取り出す」という直接的な方法がないので、
「ファイルのn文字目からn文字分取り出す」命令である「substring()」と、
「文字の長さを取得する」命令である「string-length()」を組み合わせます。

<xsl:if test="substring( file1, string-length( file1 ) - 2, 3 )='pdf'">
PDFファイル
</xsl:if>
<xsl:if test="substring( file1, string-length( file1 ) - 2, 3 )='txt'">
TEXTファイル
</xsl:if>

 こんな感じでいけると思います。
 動作未確認ですが、後ほど動作確認済のものをまた掲載いたします。

Re: ファイルの拡張子で表示を振り分ける

Posted: 2005年9月30日(金) 22:56
by webmaster
 webmasterです。

 動作確認致しました。問題なく動作しますが、トラブル回避の為、少し修正を
加えました。

コード: 全て選択

  <xsl:if test="substring( file1/@org, string-length( file1/@org ) - 2, 3 )='pdf'">
    PDFファイル
  </xsl:if>
  <xsl:if test="substring( file1/@org, string-length( file1/@org ) - 2, 3 )='txt'">
    TEXTファイル
  </xsl:if>
 file1を直接使うのではなく、file1/@org のように、元ファイル名を使うように
しました。この方が早く処理されるのではないかと思います。

 このサンプルはXSLTに慣れていないと「ちんぷんかんぷん」だと思いますので、
file1の部分と'pdf'や'txt'などの拡張子との比較の部分などを変えてそのまま
使って頂ければOKかと思います。

 いちおう、このサンプルについて簡単にご説明します。

 まず、substring関数は、指定した文字列のn番目の文字からk文字分
を抜き出す関数です。
 substring( 文字列, n, k ) の書式になります。
 これを使って、「test01.pdf」というファイル名から「pdf」の部分を抜き出したい
とします。考え方としては「後ろから3文字分を取り出す」ということになるのですが、
substring関数は「n文字目から3文字分」のようにしか指定できないので、
「ファイル名全体の文字数 - 3 + 1」を抜き出す開始点とします。+1しているのは、
最後の文字から3つ前にズラすと「p」ではなく「.」まで戻ってしまう為です。

 "test01.pdf"のファイル名全体の文字数は10文字です。10 - 3 + 1 = 8で、
substring( 'test01.pdf', 8, 3 ) とすれば、'pdf'の文字が取得できることに
なります。

 次に、ファイル名全体の文字数を取得する方法を考えます。
 これは、ズバリ string-length関数を使えば取得できます。
 file1/@org に 'test01.pdf'というファイル名が入っているとして、
 string-length( file1/@org ) と書けば、"10"が返ります。

 以上で道具が揃ったので、全部組み合わせて、

 substring( file1/@org, string-length( file1/@org ) - 3 + 1, 3 )

 で、拡張子の部分を取得できるようになりました。
 「- 3 + 1 」の部分が冗長なので、「- 2」としてしまいます。

 substring( file1/@org, string-length( file1/@org ) - 2, 3 )

 そして、この結果が'pdf'なのか'txt'なのか、などを比較すればOKです。
 比較はいつものようにxsl:if を使います。

 <xsl:if test="substring( file1/@org, string-length( file1/@org ) - 2, 3 )='pdf'">

 これで、拡張子が'pdf'の場合はこのif要素が実行されるようになります。

 ご不明な点などありましたらどんな些細な点でもお気軽にお寄せ下さい。

できました。

Posted: 2005年10月02日(日) 08:17
by kem
上記の方法で、

 #ただし、4行目の最後にシングルクォーテーションが足りませんね。
  4行目は、
  <xsl:if test="substring( file1/@org, string-length( file1/@org ) - 2, 3 )='txt'">

拡張子によって表示を振り分けることができました! ありがとうございます。

これを応用すると、アップロードしたファイル名によっていろいろ表示を変えられたり
して、使い方が広がりそうですね。

 またわからないことがあったら質問等すると思いますが、どうぞよろしくお願いいたします。  

Re: できました。

Posted: 2005年10月02日(日) 11:31
by webmaster
 kemさん、間違いのご指摘ありがとうございます。m(__)m
 混乱があるといけないので、元投稿の方を直接修正させて頂きました。

 またご質問がありましたら、どうぞよろしくお願いいたします。