2005年08月02日

MSXMLを利用しHTMLを動的に生成する方法

WEBサーバーアプリケーションなどから動的HTMLを
効率よく作成したいとお探しのあなたに便利な
Delphiで作成したサンプルプログラムを紹介します。


今回ご紹介するプログラムは
WindowsOS標準DOMの「MSXML」を利用し、
XMLデータファイルとXSLスタイルシートファイルから
HTML形式のファイルを動的に生成する
コンソールアプリケーションです。


あなたがこのプログラムを利用する場合、
ソース上の必要な部分を切り取って使用して頂くか、
実行モジュールを子プロセスとして起動し利用してください。

掲載したサンプルは
国、首都、人口のXMLデータファイルと
上記の各項目を表形式にするXSLスタイルシートから
HTML形式のファイルを生成します。


ではさっそく、プログラムを紹介しましょう。

XSLTソースは【続きを読む】をクリック!

コマンド
XSLT [xml_file xsl_file [output_file]]
説明
xml_fileで指定したXMLデータファイルと、xsl_fileで指定したスタイルシートファイルから、output_fileで指定したHTMLファイルを生成します。output_fileは省略可能です。省略した場合、生成されるHTMLは画面に出力されます。HTMLの出力結果は、リダイレクトでファイルへ出力することも可能です。
使用例
XSLT country.xml country.xsl > country.htm

【コマンドの実行結果】

Name
Capital
Population
Argentina
Buenos Aires
32300003
Bolivia
La Paz
7300000
Brazil
Brasilia
150400000
Canada
Ottawa
26500000
Chile
Santiago
13200000
Colombia
Bagota
33000000
Cuba
Havana
10600000
Ecuador
Quito
10600000
El Salvador
San Salvador
5300000
Guyana
Georgetown
800000
Jamaica
Kingston
2500000
Mexico
Mexico City
88600000
Nicaragua
Managua
3900000
Paraguay
Asuncion
4660000
Peru
Lima
21600000
United States of America
Washington
249200000
Uruguay
Montevideo
3002000
Venezuela
Caracas
19700000

関連書籍


Copyright guy@かしらもんじ でぇ〜

注意:
 下記ソースファイルは、本ページの管理者である「guy」が個人的に作成しました。
 このソースは作者に断り無く、個人がコピー、改造することは許可しますが、
 いかなる場合であっても、商用目的に使用することを固く禁じます。
 あと、ホームページでの公開の都合上、各ソースの先頭に全角スペースが入ってます。
 あなたがDelphiでコンパイルする前に、この全角スペースを半角スペースに変換してくださいね。

Delphi Project File: XSLT.dpr
Program XSLT;

{$APPTYPE CONSOLE}

uses
 Classes,
 Forms,
 SysUtils,
 XMLDoc,
 XMLDom,
 XSLProd;

var
 gExtCode: Integer;
 gCurPath,
 gXMLFile,
 gXSLFile,
 gOutFile: String;
 gXMLD:  TXMLDocument   = Nil;
 gXSLT:  TXSLPageProducer = Nil;
 gOUTD:  TFileStream   = Nil;

begin
 gExtCode := 0;
 gCurPath := GetCurrentDir;
 try
  //--------------------------------------------------------------------------
  if (not (ParamCount in [2,3])) then
  begin
   WriteLn('XSLT for Windows (depends on MSXML) Ver.1.0.0.0.');
   WriteLn('Copyright(C) guy@かしらもんじ でぇ〜');
   WriteLn;
   WriteLn('Usage: XSLT [xml_file xsl_file [output_file]]');
   gExtCode := 1;
   Exit;
  end;
  //--------------------------------------------------------------------------
  gXMLFile := ParamStr(1);
  gXSLFile := ParamStr(2);
  gOutFile := ParamStr(3);
  try
   Application.Initialize;
   SetCurrentDir(ExtractFilePath(Application.ExeName));
   //------------------------------------------------------------------------
   if (not FileExists(gXMLFile)) then
   begin
    WriteLn(Format('Error: XML ("%s") dosen''t exist.', [gXMLFile]));
    gExtCode := 2;
    Exit;
   end;
   gXMLD := TXMLDocument.Create(Application);
   gXMLD.DOMVendor := DOMVendors.Find('MSXML');
   gXMLD.FileName := gXMLFile;
   gXMLD.Active  := True;
   //------------------------------------------------------------------------
   if (not FileExists(gXSLFile)) then
   begin
    WriteLn(Format('Error: XSL ("%s") dosen''t exist.', [gXSLFile]));
    gExtCode := 3;
    Exit;
   end;
   gXSLT := TXSLPageProducer.Create(Application);
   gXSLT.DOMVendor := DOMVendors.Find('MSXML');
   gXSLT.XMLData  := gXMLD;
   gXSLT.FileName := gXSLFile;
   gXSLT.Active  := True;
   //------------------------------------------------------------------------
   if (gOutFile <> '') then
   begin
    try
     gOUTD := TFileStream.Create(gOutFile, fmCreate, fmShareDenyWrite);
     gOUTD.Write(Pointer(gXSLT.Content)^, Length(gXSLT.Content));
    except
     WriteLn(Format('Error: Cannot create output ("%s").', [gOutFile]));
     gExtCode := 4;
     Exit;
    end;
   end
   else
    WriteLn(gXSLT.Content);
  except
   On E: Exception do
   begin
    WriteLn(Format('Error: %s.', [E.Message]));
    gExtCode := 5;
   end;
  end;
 finally
  if (gXMLD <> Nil) then
   gXMLD.Free;
  if (gXSLT <> Nil) then
   gXSLT.Free;
  if (gOUTD <> Nil) then
   gOUTD.Free;
  SetCurrentDir(gCurPath);
  if (gExtCode > 0) then
   Halt(gExtCode);
 end;
end.


XML Data Sample File: country.xml
<?xml version="1.0" standalone="yes"?> 
<DATAPACKET Version="2.0">
 <METADATA>
  <FIELDS>
   <FIELD attrname="Name" fieldtype="string" WIDTH="24"/>
   <FIELD attrname="Capital" fieldtype="string" WIDTH="24"/>
   <FIELD attrname="Population" fieldtype="r8"/>
  </FIELDS>
  <PARAMS DEFAULT_ORDER="1" PRIMARY_KEY="1" LCID="2057"/>
 </METADATA>
 <ROWDATA>
  <ROW Name="Argentina" Capital="Buenos Aires" Population="32300003"/>
  <ROW Name="Bolivia" Capital="La Paz" Population="7300000"/>
  <ROW Name="Brazil" Capital="Brasilia" Population="150400000"/>
  <ROW Name="Canada" Capital="Ottawa" Population="26500000"/>
  <ROW Name="Chile" Capital="Santiago" Population="13200000"/>
  <ROW Name="Colombia" Capital="Bagota" Population="33000000"/>
  <ROW Name="Cuba" Capital="Havana" Population="10600000"/>
  <ROW Name="Ecuador" Capital="Quito" Population="10600000"/>
  <ROW Name="El Salvador" Capital="San Salvador" Population="5300000"/>
  <ROW Name="Guyana" Capital="Georgetown" Population="800000"/>
  <ROW Name="Jamaica" Capital="Kingston" Population="2500000"/>
  <ROW Name="Mexico" Capital="Mexico City" Population="88600000"/>
  <ROW Name="Nicaragua" Capital="Managua" Population="3900000"/>
  <ROW Name="Paraguay" Capital="Asuncion" Population="4660000"/>
  <ROW Name="Peru" Capital="Lima" Population="21600000"/>
  <ROW Name="United States of America" Capital="Washington" Population="249200000"/>
  <ROW Name="Uruguay" Capital="Montevideo" Population="3002000"/>
  <ROW Name="Venezuela" Capital="Caracas" Population="19700000"/>
 </ROWDATA>
</DATAPACKET>


Style Sheet Sample File: country.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:template match="/">
 <html>
  <xsl:apply-templates/>
 </html>
</xsl:template>

<xsl:template match="ROWDATA">
 <table frame="border" width="100%">
  <tr>
  <th>Name</th>
  <th>Capital</th>
  <th>Population</th>
  </tr>
  <xsl:for-each select="ROW">
   <tr>
   <td><xsl:value-of select="@Name"/></td>
   <td><xsl:value-of select="@Capital"/></td>
   <td><xsl:value-of select="@Population"/></td>
   </tr>
  </xsl:for-each>
 </table>
</xsl:template>

</xsl:stylesheet>

posted by guy at 08:14 | XML編
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。