■XMLメモ





XSLのテスト

テストのファイルには以下のファイルを使用。中身のデータはオフィシャルサイトから引用。

shufflechara.xml
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="bust83.xsl" ?>
<charlist>
 <char id="1">
   <name>リシアンサス</name>
   <nickname>シア</nickname>
   <CV>あおきさやか</CV>
   <birthday>7/30</birthday>
   <height>160</height>
   <bust>81</bust>
   <waist>58</waist>
   <hip>83</hip>
   <hobby>人間界のニュースのスクラップ</hobby>
 </char>
 <char id="2">
   <name>ネリネ</name>
   <nickname>リン</nickname>
   <CV>永見はるか</CV>
   <birthday>10/13</birthday>
   <height>154</height>
   <bust>88</bust>
   <waist>59</waist>
   <hip>85</hip>
   <hobby>手芸、裁縫、編み物</hobby>
 </char>
 <char id="3">
   <name>芙蓉 楓</name>
   <nickname></nickname>
   <CV>後藤邑子</CV>
   <birthday>11/10</birthday>
   <height>162</height>
   <bust>83</bust>
   <waist>59</waist>
   <hip>84</hip>
   <hobby>家事全般</hobby>
 </char>
 <char id="4">
   <name>時雨 亜沙</name>
   <nickname></nickname>
   <CV>伊藤美紀</CV>
   <birthday>10/20</birthday>
   <height>163</height>
   <bust>87</bust>
   <waist>60</waist>
   <hip>85</hip>
   <hobby>ケーキ作り</hobby>
 </char>
 <char id="5">
   <name>プリムラ</name>
   <nickname>リム</nickname>
   <CV>ひと美</CV>
   <birthday>1/25</birthday>
   <height>151</height>
   <bust>78</bust>
   <waist>55</waist>
   <hip>80</hip>
   <hobby>まだない</hobby>
 </char>
</charlist>

このファイルを処理するためのXSLは次のファイル。

bust83.xsl
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
 <html> 
  <head> <title>シャッフルキャラリスト</title> </head>
  <body>
    <xsl:apply-templates select="charlist"/> 
  </body>
 </html>
</xsl:template>
<xsl:template match="charlist">
  胸がおっきい人<BR/>
  <table border="1">
 <tr>
     <td>名前</td>
     <td>ニックネーム</td>
     <td>CV</td>
     <td>B</td>
 </tr>
   <xsl:apply-templates select="char"/>
 </table>
</xsl:template>
<xsl:template match="char">
  <xsl:if test="bust &gt;= 83">
  <tr>
   <xsl:apply-templates select="name"/>
   <xsl:apply-templates select="nickname"/>
   <xsl:apply-templates select="CV"/>
   <xsl:apply-templates select="bust"/>
  </tr>
  </xsl:if>
</xsl:template>
<xsl:template match="name">
  <td>
   <xsl:copy-of select="." />
  </td>
</xsl:template>
<xsl:template match="nickname">
  <td>
    <xsl:copy-of select="." />
  </td>
</xsl:template>
<xsl:template match="CV">
  <td>
   <xsl:copy-of select="." />
  </td>
</xsl:template>
<xsl:template match="bust">
  <td>
<xsl:copy-of select="." />
  </td>
</xsl:template>
</xsl:stylesheet>


2つのファイルを同じフォルダに置いて、IE6で見るとデータが選択されて出力される。なお、ファイルのエンコーディングはUTF-8。
この方式は結構面倒。Perlを使う方法をそのうち考えよう。


XMLスキーマ


スキーマの勉強。上のXMLファイルのスキーマ。

shuffleschema.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="charlist">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="char" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
 </xsd:element>
 <xsd:element name="char">
   <xsd:complexType>
     <xsd:sequence>
      <xsd:element name="name" type="xsd:string" />
      <xsd:element name="nickname" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="CV" type="xsd:string" />
      <xsd:element name="birthday" type="xsd:string" />
      <xsd:element name="height" type="xsd:decimal" />
      <xsd:element name="bust" type="xsd:decimal" />
      <xsd:element name="waist" type="xsd:decimal" />
      <xsd:element name="hip" type="xsd:decimal" />
      <xsd:element name="hobby" type="xsd:string" />
     </xsd:sequence>
     <xsd:attribute name="id" type="xsd:decimal" /> 
   </xsd:complexType>
 </xsd:element>
</xsd:schema>

チェックするValidatorはいろいろある。PerlのXML::Validator::Schemaは動くが、エラーになっていても正確な行数を表示しない(?)。ここのを使うと楽。


XML::DOM


使い方がマニュアルを読んでもわかりにくい。こんなページを発見。

子ノードを再帰的に探し、テキストをプリントする。
#!/usr/bin/perl -w

use strict;
use utf8;

use XML::DOM;
binmode(STDOUT,":utf8");


my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile("shufflechara.xml");

&walk( $doc );

sub walk {
    my( $root ) = @_;

    my @list = $root->getChildNodes;
    foreach my $val (@list){
        &walk( $val );
        if( $val->getNodeTypeName eq "TEXT_NODE" ){
            print $val->getNodeValue;
        }
    }
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2005年10月20日 16:39