2019年7月29日月曜日

Kaleidox: XML

アクション言語を実用的に使用するにはXML, HTML, JSON, CSV, Excelといったクラウドアプリケーションで使用する各種データ形式を容易に扱えるようになっている必要があります。これらのデータをプログラム内に取り込んだり、データ形式間の相互運用が簡単にできることが重要です。

Kaleidoxでは各種データ形式の個々の操作性と、これらのデータ形式間の相互運用の両面について最適な記述が可能となるような言語機能を提供しています。

ここではまずXMLの操作についてみていきます。

XMLリテラル

KaleidoxはXMLを第一級の言語要素として考えていることもあり、リテラルで記述することができます。

以下のXMLを考えます。

  1. <account>  
  2.   <id>0001</id>  
  3.   <name>taro</name>  
  4.   <point>100</point>  
  5. </account>  

まずKaleidoxプログラムですが、以下のように上記XMLを直接XMLリテラルとして記述することができます。

  1. <account>  
  2.   <id>0001</id>  
  3.   <name>taro</name>  
  4.   <point>100</point>  
  5. </account>  

上記プログラムをsample.kに格納して実行すると以下のようになります。

$ kaleidox sample.k
<account>
  <id>0001</id>
  <name>taro</name>
  <point>100</point>
</account>

XMLリテラルで記述されたXML文書がそのまま評価され、評価結果がXML文書として出力されました。

REPL

REPLで同様の処理を行うと以下のようになります。

kaleidox> <account>
  <id>0001</id>
  <name>taro</name>
  <point>100</point>
</account>
<account>\n  <id>0001</id>\n  <name>taro</name>\n  <point>100</point>\n</acco...

プロンプトからXML文書を入力しています。

通常REPLのプロンプトからは改行を区切りとした一行の式を入力しますが、XMLやJSONなどの構造を持つリテラルはリテラル内に改行が入っていても入力することができます。

kaleidox> :show
<account>
  <id>0001</id>
  <name>taro</name>
  <point>100</point>
</account>

ファイルから読み込む場合はURLを指定します。

kaleidox> file:sample.xml
<account>\n  <id>0001</id>\n  <name>taro</name>\n  <point>100</point>\n</acco...

読み込み結果をshowコマンドで表示すると以下になります。

kaleidox> :show
Xml(String)
<account>
  <id>0001</id>
  <name>taro</name>
  <point>100</point>
</account>

XPath

XML文書を処理する場合にはXPathによるXML文書内のデータアクセスが極めて有効です。

KaleidoxではXPathによるXML文書アクセスを行うことができます。

kaleidox> <account>
  <id>0001</id>
  <name>taro</name>
  <point>100</point>
</account>
<account>\n  <id>0001</id>\n  <name>taro</name>\n  <point>100</point>\n</acco...
kaleidox> /account/name
"taro"

XSLT

XML文書の操作ではXSLTによる変換も重要です。

変換対象のXML文書として前出のものを使用します。ファイルsample.xmlに格納しています。

  1. <account>  
  2.   <id>0001</id>  
  3.   <name>taro</name>  
  4.   <point>100</point>  
  5. </account>  

XML文書を閲覧用のHTML文書に変換するXSLです。ファイルsample.xslに格納します。

  1. <?xml version="1.0" encoding="Shift_JIS"?>  
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  3.   <xsl:output method="html"></xsl:output>  
  4.   
  5.   <xsl:template match="/">  
  6.     <HTML>  
  7.     <BODY>  
  8.     <xsl:apply-templates/>  
  9.     </BODY>  
  10.     </HTML>  
  11.   </xsl:template>   
  12.   
  13.   <xsl:template match="account">  
  14.     <TABLE>  
  15.       <THEAD>  
  16.         <TR>  
  17.           <TH>Name</TH>  
  18.    <TH>Value</TH>  
  19.         </TR>  
  20.       </THEAD>  
  21.       <TBODY>  
  22.  <TR>  
  23.    <TD><xsl:value-of select="id"/></TD>  
  24.    <TD><xsl:value-of select="name"/></TD>  
  25.    <TD><xsl:value-of select="point"/></TD>  
  26.  </TR>  
  27.       </TBODY>  
  28.     </TABLE>  
  29.   </xsl:template>   
  30. </xsl:stylesheet>  

XSLT変換はxslt関数で行うことができます。

引数にはXSLリテラルまたはXSL文書URL、XMLリテラルまたはXML文書URLを指定します。

以下ではXSL文書URLとXML文書URLを指定しています。xslt関数実行の結果、XML文書を変換したHTML文書に得ることができました。

kaleidox> xslt file:sample.xsl file:sample.xml
<HTML><BODY><TABLE><THEAD><TR><TH>Name</TH><TH>Value</TH></TR></THEAD><TB...
kaleidox> :show:print
<HTML><BODY><TABLE><THEAD><TR><TH>Name</TH><TH>Value</TH></TR></THEAD><TBODY><TR><TD>0001</TD><TD>taro</TD><TD>100</TD></TR></TBODY></TABLE></BODY></HTML>

関数を省略してもXSLファイルが先頭の場合はxslt関数が実行されます。

kaleidox> file:sample.xsl file:sample.xml
<HTML><BODY><TABLE><THEAD><TR><TH>Name</TH><TH>Value</TH></TR></THEAD><TB...

Record

Kaleidoxはレコード/テーブル指向の言語なので、各種データをレコードに変換すると、より柔軟にデータ操作を行うことができます。

record-make関数でXMLからレコードを生成する事ができます。record-make関数はスキーマを与えなくてもXML文書の内容からレコードのスキーマを推測します。

kaleidox> record-make file:sample.xml
id:1,name:taro,point:100

Table

XMLをテーブルに変換することで、Kaleidoxが提供するテーブル操作機能を使ってデータ操作を行うことができます。

table-make関数でXMLからテーブルを生成することができます。table-make関数はスキーマを与えなくてもXML文書の内容からレコードのスキーマを推測します。

kaleidox> table-make file:sample.xml
Table[3x1]

生成されたテーブルデータを表示するためにshowコマンドを実行すると以下の情報が表示されます。

kaleidox> :show
Table[3x1]
┏━━━━┯━━━━┯━━━━━┓
┃id  │name│point┃
┣━━━━┿━━━━┿━━━━━┫
┃0001│taro│100  ┃
┗━━━━┷━━━━┷━━━━━┛
リスト

データ列を記述するXML文書として以下のものをsample-list.xmlとして用意します。

  1. <accounts>  
  2.   <account>  
  3.     <id>0001</id>  
  4.     <name>taro</name>  
  5.     <point>100</point>  
  6.   </account>  
  7.   <account>  
  8.     <id>0002</id>  
  9.     <name>hanako</name>  
  10.     <point>200</point>  
  11.   </account>  
  12. </accounts>  

ここからtable-make関数を使ってテーブルを生成します。

kaleidox> table-make file:sample-list.xml
Table[3x2]

生成した結果のテーブルは以下になります。

kaleidox> :show:print
┏━━━━┯━━━━━━┯━━━━━┓
┃id  │name  │point┃
┣━━━━┿━━━━━━┿━━━━━┫
┃0001│taro  │100  ┃
┠────┼──────┼─────┨
┃0002│hanako│200  ┃
┗━━━━┷━━━━━━┷━━━━━┛

まとめ

今回はXMLの操作について説明しました。

次回以降、HTML, JSON, CSV, Excelの順にデータ操作方法についてみていく予定です。

諸元

  • Kaleidox : 0.1.3