この記事の続きです:
nsf2dxl2web の挑戦(1)
上記記事では自分が開発中(公開予定)のツール nsf2dxl2web の概要を紹介しました。第2回目である今回は技術編と位置づけ、 nsf2dxl2web が動作する仕組みについて紹介します。現時点(2023-11-07)ではまだツールそのものを公開しておらず、試すことができないため仕組みの紹介もわかりにくい点があるかもしれませんが、どのような仕組みで、どのような変換を行うのか、その理解の上で必要な知識である XSLT も交えて紹介したいと思います。
【2つのツール+オプション】
nsf2dxl2web は主に nsf2dxl と dxl2web という2つのツールから構成されていて、これらに加えオプションとして更にいくつかの補助ツールが用意されています。ツール名に含まれる "nsf" というのは(ノーツデータベースファイルの拡張子が "nsf" であることから)ノーツデータベースのことを指しています。ノーツデータベースに対してまず nsf2dxl(NSF to DXL) の処理を行うことでノーツデータベースを DXL(Domino XML Language) という XML の派生フォーマットに変換します。 その結果である DXL に対して dxl2web(DXL to Web) の処理を行ってウェブ化(ウェブコンテンツ化)する、という2段階の処理を続けて行います。この NSF to DXL と DXL to Web の2段階の処理をそれぞれ nsf2dxl と dxl2web を使って行うことになります。
【DXL】
上述の説明内にも出てきた DXL(Domino XML Language) は知らない人も多いと思うので補足しておきます。DXL は Domino(ノーツサーバー)が管理するデータベース内の文書データや設計要素を domino.dtd のルールに従って XML フォーマットで記述したものです。ノーツの拡張機能である LotusScript や Java を使ってデータベース(の全体または一部)を DXL フォーマットで出力したり、DXL で記述された情報からバイナリデータであるノーツデータベースに変換することができます。
nsf2dxl2web を使う上で DXL の最大の特徴は「テキストファイル」であることです。バイナリデータであるノーツデータベースファイルはノーツクライアントまたはノーツサーバーを使って正しい権限の ID でログインした上でないと開いて中身を確認することもできませんが、DXL(つまり XML)になっていればテキストエディタで開くこともできるようになります。
nsf2dxl2web はこの名前の通り、nsf(ノーツデータベース)をノーツの機能を使って一旦 dxl(XML テキスト)に変換(nsf2dxl)した上で、再度 dxl を web コンテンツに変換(dxl2web)することで一連の変換処理が完了します。
【XML と XSL(と XSLT)】
上述の DXL の説明内で「nsf を dxl に変換」し、「dxl を web コンテンツに変換」すると書きました。前者の処理はノーツが持つ DXL エクスポート機能を使うことでできるのですが、後者の処理(UI を持たない XML を UI 付きの HTML へ変換)はどのようにするのでしょう? この答が「XSL を使って XML を HTML に変換する」です。
XSL(eXtensible Stylesheet Language) は XML というフォーマットに従って作られた文書(XML 文書)に対して、その構造や表示方法を印刷および閲覧に適した状態に整える、その見栄えを定義するマークアップ言語です。XSL 自体も XML の拡張として定義されています。また「XML を XSL を使って印刷および閲覧に適した状態に整える」この変換処理のことを XSLT(eXtensible Stylesheet Language Transformation) と呼びます。
具体例があった方がわかりやすいと思うので、簡単な例を紹介します。まず以下のような XML データ(test01.xml)があったとします:
この程度であれば UI がなくてもなんとなく全容が見えてくる XML データだと思っています。クラスの科目別成績表のようなデータが XML フォーマットで格納されている、と思っていただくのがいいでしょう。
この XML データに対して、以下のような XSL (test01.xsl)を適用することを考えてみます:
XSL にあまり詳しくなくても、この例をみると何となく結果がイメージできるのではないでしょうか? XSL の中に <xsl:template match="/"> ~ </xsl:template> で囲われた箇所があり、この中に変換元である XML(上述の test01.xml)の "/" にマッチする部分(つまり全体)が適用されて変換されます。 そしてこの箇所には <xsl:value-of select="成績表/見出し" /> と書かれた部分が2か所存在しています。この部分は変換元 XML(test01.xml)の "/" にマッチした部分(つまり全体)の中の、"成績表/見出し" 要素(つまり "/成績表/見出し" 要素)の値が適用されることになります。変換元 XML (test01.xml)を見ると "/成績表/見出し" 要素の値というのは「成績表」という文字列です。つまりこの例だと <xsl:value-of select="成績表/見出し" /> 部分には「成績表」という文字列が入ることになります。
また、この XSL 内には <xsl:for-each select="成績表/結果"> ~ </xsl:for-each> で囲われた箇所もあります。変換元 XML(test01.xml)の "/成績表/結果" は複数存在しています。つまり全ての "/成績表/結果" 要素に対してループを行っている、ということが何となくわかるのではないかと思います。
そしてそのループの中では上述と同様の <xsl:value-of match="@名前"/> 、<xsl:value-of match="@国語"/> 、<xsl:value-of match="@数学"/> という値を取り出している箇所がありますが、これらはそれぞれループ内の要素から「名前属性値」、「国語属性値」、「数学属性値」をそれぞれ取り出して適用する、という内容が定義されています。
そして、この XML(test01.xml)に XSL(test01.xsl)を適用した XSLT の結果は以下のような HTML になります:
↑これが XML と XSL による XSLT です。XSLT という処理がノーツの文書とフォームの関係に近い処理をしていることがお分かりいただけるでしょうか。
そして XSLT が理解できているとなんとなく想像できると思いますが、nsf2dxl2web というツールを使うことで、
・ノーツの文書 DXL (XML) データとフォームの DXL データを取り出し、
・ノーツ文書の DXL データと
・フォームの XSL データを使って、
・これらを XSLT することで、ノーツ文書の HTML を生成する
という方法でノーツデータベースのウェブ化を実現しています。そのための準備として、上述の dxl2web というツールを使って、
・フォームの DXL(XML) から XSL を作る
・ノーツ文書の DXL(XML) を HTML 向けに微調整する
という処理を行います。この「微調整」の意味ですが、ノーツの機能を使って DXL エクスポートされた文書データのリッチテキストフィールドには HTML に近い(けど異なる)フォーマットでデータが格納されています。この似て非なるフォーマットを HTML で表示する前提となるフォーマットに変換する、という前処理を行っています。なお文書データをウェブ化、つまり HTML 化する XSLT の処理はこのフォーマットが微調整された文書 DXL に対して(表示時に)動的に行います。このためフォームの XSL を変更すれば、そのフォームを使う全文書の UI を変えるというカスタマイズを(後からでも)行うことができるような仕組みにしています。
理想は単独のツールだけで NSF をウェブ化できるのが理想と思いつつも、カスタマイズの要素を残そうとすると単独ツールで最後まで処理してしまうことは必ずしも正しくないと判断し、nsf2dxl2web は2回(カスタマイズ内容によってもう数回)のツール実行でウェブ化するような設計にしています。
nsf2dxl2web の挑戦(1)
上記記事では自分が開発中(公開予定)のツール nsf2dxl2web の概要を紹介しました。第2回目である今回は技術編と位置づけ、 nsf2dxl2web が動作する仕組みについて紹介します。現時点(2023-11-07)ではまだツールそのものを公開しておらず、試すことができないため仕組みの紹介もわかりにくい点があるかもしれませんが、どのような仕組みで、どのような変換を行うのか、その理解の上で必要な知識である XSLT も交えて紹介したいと思います。
【2つのツール+オプション】
nsf2dxl2web は主に nsf2dxl と dxl2web という2つのツールから構成されていて、これらに加えオプションとして更にいくつかの補助ツールが用意されています。ツール名に含まれる "nsf" というのは(ノーツデータベースファイルの拡張子が "nsf" であることから)ノーツデータベースのことを指しています。ノーツデータベースに対してまず nsf2dxl(NSF to DXL) の処理を行うことでノーツデータベースを DXL(Domino XML Language) という XML の派生フォーマットに変換します。 その結果である DXL に対して dxl2web(DXL to Web) の処理を行ってウェブ化(ウェブコンテンツ化)する、という2段階の処理を続けて行います。この NSF to DXL と DXL to Web の2段階の処理をそれぞれ nsf2dxl と dxl2web を使って行うことになります。
【DXL】
上述の説明内にも出てきた DXL(Domino XML Language) は知らない人も多いと思うので補足しておきます。DXL は Domino(ノーツサーバー)が管理するデータベース内の文書データや設計要素を domino.dtd のルールに従って XML フォーマットで記述したものです。ノーツの拡張機能である LotusScript や Java を使ってデータベース(の全体または一部)を DXL フォーマットで出力したり、DXL で記述された情報からバイナリデータであるノーツデータベースに変換することができます。
nsf2dxl2web を使う上で DXL の最大の特徴は「テキストファイル」であることです。バイナリデータであるノーツデータベースファイルはノーツクライアントまたはノーツサーバーを使って正しい権限の ID でログインした上でないと開いて中身を確認することもできませんが、DXL(つまり XML)になっていればテキストエディタで開くこともできるようになります。
nsf2dxl2web はこの名前の通り、nsf(ノーツデータベース)をノーツの機能を使って一旦 dxl(XML テキスト)に変換(nsf2dxl)した上で、再度 dxl を web コンテンツに変換(dxl2web)することで一連の変換処理が完了します。
【XML と XSL(と XSLT)】
上述の DXL の説明内で「nsf を dxl に変換」し、「dxl を web コンテンツに変換」すると書きました。前者の処理はノーツが持つ DXL エクスポート機能を使うことでできるのですが、後者の処理(UI を持たない XML を UI 付きの HTML へ変換)はどのようにするのでしょう? この答が「XSL を使って XML を HTML に変換する」です。
XSL(eXtensible Stylesheet Language) は XML というフォーマットに従って作られた文書(XML 文書)に対して、その構造や表示方法を印刷および閲覧に適した状態に整える、その見栄えを定義するマークアップ言語です。XSL 自体も XML の拡張として定義されています。また「XML を XSL を使って印刷および閲覧に適した状態に整える」この変換処理のことを XSLT(eXtensible Stylesheet Language Transformation) と呼びます。
具体例があった方がわかりやすいと思うので、簡単な例を紹介します。まず以下のような XML データ(test01.xml)があったとします:
<?xml version="1.0" ?> <成績表> <見出し>成績表</見出し> <結果 名前="佐藤" 国語="50" 数学="90"/> <結果 名前="鈴木" 国語="70" 数学="60"/> <結果 名前="田中" 国語="80" 数学="40"/> </成績表>
この程度であれば UI がなくてもなんとなく全容が見えてくる XML データだと思っています。クラスの科目別成績表のようなデータが XML フォーマットで格納されている、と思っていただくのがいいでしょう。
この XML データに対して、以下のような XSL (test01.xsl)を適用することを考えてみます:
<?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/> <xsl:template match="/"> <html> <head> <title><xsl:value-of select="成績表/見出し" /></title> </head> <body> <h1><xsl:value-of select="成績表/見出し" /></h1> <table id="mytable"> <thead> <tr><th>名前</th><th>国語</th><th>数学</th></tr> </thead> <tbody> <xsl:for-each select="成績表/結果"> <tr> <td><xsl:value-of select="@名前" /></td> <td><xsl:value-of select="@国語" /></td> <td><xsl:value-of select="@数学" /></td> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template> </xsl:stylesheet>
XSL にあまり詳しくなくても、この例をみると何となく結果がイメージできるのではないでしょうか? XSL の中に <xsl:template match="/"> ~ </xsl:template> で囲われた箇所があり、この中に変換元である XML(上述の test01.xml)の "/" にマッチする部分(つまり全体)が適用されて変換されます。 そしてこの箇所には <xsl:value-of select="成績表/見出し" /> と書かれた部分が2か所存在しています。この部分は変換元 XML(test01.xml)の "/" にマッチした部分(つまり全体)の中の、"成績表/見出し" 要素(つまり "/成績表/見出し" 要素)の値が適用されることになります。変換元 XML (test01.xml)を見ると "/成績表/見出し" 要素の値というのは「成績表」という文字列です。つまりこの例だと <xsl:value-of select="成績表/見出し" /> 部分には「成績表」という文字列が入ることになります。
また、この XSL 内には <xsl:for-each select="成績表/結果"> ~ </xsl:for-each> で囲われた箇所もあります。変換元 XML(test01.xml)の "/成績表/結果" は複数存在しています。つまり全ての "/成績表/結果" 要素に対してループを行っている、ということが何となくわかるのではないかと思います。
そしてそのループの中では上述と同様の <xsl:value-of match="@名前"/> 、<xsl:value-of match="@国語"/> 、<xsl:value-of match="@数学"/> という値を取り出している箇所がありますが、これらはそれぞれループ内の要素から「名前属性値」、「国語属性値」、「数学属性値」をそれぞれ取り出して適用する、という内容が定義されています。
そして、この XML(test01.xml)に XSL(test01.xsl)を適用した XSLT の結果は以下のような HTML になります:
<html> <head> <title> 成績表 </title> </head> <body> <h1> 成績表 </h1> <table id="mytable"> <thead> <tr><th>名前</th><th>国語</th><th>数学</th></tr> </thead> <tbody> <tr> <td> 佐藤 </td> <td> 50 </td> <td> 90 </td> </tr> <tr> <td> 鈴木 </td> <td> 70 </td> <td> 60 </td> </tr> <tr> <td> 田中 </td> <td> 80 </td> <td> 40 </td> </tr> </tbody> </table> </body> </html>
↑これが XML と XSL による XSLT です。XSLT という処理がノーツの文書とフォームの関係に近い処理をしていることがお分かりいただけるでしょうか。
そして XSLT が理解できているとなんとなく想像できると思いますが、nsf2dxl2web というツールを使うことで、
・ノーツの文書 DXL (XML) データとフォームの DXL データを取り出し、
・ノーツ文書の DXL データと
・フォームの XSL データを使って、
・これらを XSLT することで、ノーツ文書の HTML を生成する
という方法でノーツデータベースのウェブ化を実現しています。そのための準備として、上述の dxl2web というツールを使って、
・フォームの DXL(XML) から XSL を作る
・ノーツ文書の DXL(XML) を HTML 向けに微調整する
という処理を行います。この「微調整」の意味ですが、ノーツの機能を使って DXL エクスポートされた文書データのリッチテキストフィールドには HTML に近い(けど異なる)フォーマットでデータが格納されています。この似て非なるフォーマットを HTML で表示する前提となるフォーマットに変換する、という前処理を行っています。なお文書データをウェブ化、つまり HTML 化する XSLT の処理はこのフォーマットが微調整された文書 DXL に対して(表示時に)動的に行います。このためフォームの XSL を変更すれば、そのフォームを使う全文書の UI を変えるというカスタマイズを(後からでも)行うことができるような仕組みにしています。
理想は単独のツールだけで NSF をウェブ化できるのが理想と思いつつも、カスタマイズの要素を残そうとすると単独ツールで最後まで処理してしまうことは必ずしも正しくないと判断し、nsf2dxl2web は2回(カスタマイズ内容によってもう数回)のツール実行でウェブ化するような設計にしています。
(過去記事や続きはこちらです)
nsf2web2dxl の挑戦(2)
コメント