XML (Extensible Markup Language) は、ある種の w3c 標準に似ているかもしれません。現時点では実際の影響はなく、たとえ将来便利になったとしても、それはずっと前のことになります。しかし、実際にはすでに使われています。そのため、XML がお気に入りの HTML エディターに追加されるまで待たずに使用を開始できます。現在、社内のさまざまな問題や b2b システムの問題を解決できます。
sparks.com では、Java オブジェクトから HTML データ表示まで、異なるシステム間のデータ表現を標準化するために XML を使用しています。
特に、データが非常に基本的な XML 構造で標準化されている場合、データの共有と操作が簡単であることがわかりました。このプロセスで、XML を使用する多くの効果的な方法を発見しました。以下では、現在のアプリケーションについて詳しく説明します。
標準化
xmlを使用する前に、使用したい情報とは異なるxmlデータ形式を作成します。
動的 XML を生成する
データベースから HTML を生成することは新しいことではありませんが、XML を生成することは新しいことです。ここでは具体的な生成手順を紹介します。
テンプレート言語として xsl を使用する
xsl (Extensible Stylesheet Language) は、XML データの表示形式を定義する良い方法です。複数の静的テンプレートに記述すると、より効果的です。
htmlを生成
xmlとxslはhtmlと同等です。正しくないように聞こえるかもしれませんが、ユーザーに表示される HTML ページは、実際には xml と xsl の結果です。
1. 標準化
XML の機能はその柔軟性に由来します。しかし、残念ながら、柔軟性が高すぎるため、どうやって問題を解決すればよいのか白紙のままになってしまうことがあります。
どの XML プロジェクトでも、最初のステップは標準データ形式を作成することです。これを行うには、次の決定を行う必要があります:
• どのようなデータを関与させるか
簡素化された API) 解析
標準の XML 形式がないため、開発者は自由に独自の形式を開発できます。ただし、形式が 1 つのアプリケーションでのみ認識される場合は、その形式を使用するためにそのアプリケーションのみを実行できます。 XML 形式を読み取ることができる他のプログラムがあれば、明らかに便利です。 XML 形式を変更すると、それを使用するシステムも変更する必要がある場合があるため、可能な限り完全な形式を構築する必要があります。ほとんどのシステムは認識できないタグを無視するため、XML の形式を変更する最も安全な方法は、タグを変更するのではなく追加することです。
sparks.com では、単に正しい xml ではなく、よく整理された xml を使用します。前者は dtd を必要としないためです。 DTD は、ユーザーがクリックしてからページを表示するまでの間に処理レイヤーを追加します。このレイヤーには多大な処理が必要であることがわかりました。もちろん、XML 形式で他の企業と通信するときに DTD を使用するのは依然として良いことです。なぜなら、dtd は送受信時にデータ構造が正しいことを保証できるからです。
現在、いくつかの解析エンジンが利用可能です。どちらを選択するかは、ほぼ完全にアプリケーションのニーズによって決まります。 DTD を使用する場合は、解析エンジンが XML を DTD で検証できるようにする必要があります。検証を別のプロセスに入れることもできますが、パフォーマンスに影響を与えます。
• サーブレットは、XML ドキュメントを生成するタスクをエンタープライズ Javabean (ejb) に引き渡すことにより、製品情報リクエストを処理します。
• ejb は jdbc を使用して、データベースから必要な製品の詳細をクエリします。
• ejb は XML ファイルを生成し、それをサーブレットに渡します。
• サーブレットは解析エンジンを呼び出して、xml ファイルと静的 xsl スタイル シートから html 出力を作成します。
(XSL アプリケーションの詳細については、「テンプレート言語としての XSL の使用」を参照してください。)
XML の生成例
Java で XML docstring を作成するための実際のコードは、いくつかのメソッドとクラスに分割できます。
XML生成プロセスを開始するコードはejbメソッドに配置されます。このインスタンスは、生成された XML 文字列を保存するための文字列バッファをすぐに作成します。
stringbuffer xml = new stringbuffer(); xml.append(xmlutils.begindocument("/browse_find/browse.xsl", "browse", request)); xml.append(product.toxml()); xml.append(xmlutils.enddocument("browse"); out.print(xml.tostring());
次の 3 つの xml.append() 変数は、それ自体が他のメソッドの呼び出しです。
ファイル ヘッダーの生成
最初の追加メソッドは、xmlutils クラスを呼び出して XML ファイル ヘッダーを生成します。 Java サーブレットのコードは次のとおりです:
public static string begindocument(string stylesheet, string page) { stringbuffer xml = new stringbuffer(); xml.append("<?xml version=\"1.0\"?>\n") .append("<?xml-stylesheet href=\"") .append(stylesheet).append("\"") .append(" type =\"text/xsl\"?>\n"); xml.append("<").append(page).append(">\n"); return xml.tostring(); }
このコードは、XML ファイル ヘッダーを生成します。 タグは、このファイルをバージョン 1.0 をサポートする XML ファイルとして定義します。コードの 2 行目は、データを表示するための正しいスタイル シートの場所を指します。最後に含まれるのは項目レベルのタグ (この例では
製品情報を入力してください
ファイルヘッダーの完成後、制御メソッドは Java オブジェクトを呼び出して XML を生成します。この例では、product オブジェクトが呼び出されます。製品オブジェクトは 2 つのメソッドを使用して XML 表現を生成します。最初のメソッド toxml() は、
public string toxml() { stringbuffer xml = new stringbuffer("<product>\n"); xml.append(internalxml()); xml.append("</product>\n"); return xml.tostring(); } public string internalxml() { stringbuffer xml = new stringbuffer("\t") .append(producttype).append("\n"); xml.append("\t").append(idvalue.trim()) .append("\n"); xml.append("\t").append(idname.trim()) .append("\n"); xml.append("\t").append(page.trim()) .append("\n"); 厖? xml.append("\t").append(amount).append("\n"); xml.append("\t").append(vendor).append("\n"); xml.append("\t\n"); xml.append("\t").append(pubdesc).append("\n"); xml.append("\t").append(vendesc).append("\n"; 厖? return xml.tostring(); }
ファイルを閉じます
最後に、xmlutils.enddocument() メソッドが呼び出されます。この呼び出しにより xml タグが閉じられ (この場合)、最終的に構造化 xml ファイルが完成します。制御メソッドからの文字列バッファ全体も文字列に変換され、元の http リクエストを処理したサーブレットに返されます。
3. テンプレート言語として xsl を使用する
HTML 出力を取得するには、生成された XML ファイルを、XML データの表現方法を制御する XSL テンプレートと結合します。当社の xsl テンプレートは、慎重に編成された xsl タグと html タグで構成されています。
テンプレートの構築を開始します
xsl テンプレートの先頭は、以下のコードのようになります。コードの最初の行は必須であり、このファイルを xsl スタイル シートとして定義します。 xmlns:xsl= 属性は、このファイルで使用される XML 名前空間を参照し、version= 属性は名前空間のバージョン番号を定義します。ファイルの最後でタグを閉じます。
次に、よく整理された HTML を見てみましょう。 XML 解析エンジンによって処理されるため、適切に構成された XML のすべてのルールに準拠する必要があります。基本的に、これはすべての開始タグに対応する終了タグが必要であることを意味します。たとえば、通常は閉じられない
タグは
で閉じる必要があります。<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="basketpage"> <html> <head> <title>shopping bag / adjust quantity</title> </head> <body bgcolor="#cccc99" bgproperties="fixed" link="#990000" vlink="#990000"> <br> ?br> </xsl:template> </xsl:stylesheet>
テンプレートの本文内には、データ表示のロジックを提供するために使用される xsl タグが多数あります。よく使用される 2 つのタグについて以下で説明します。
choose
この例では、when タグは数量タグの XML をチェックします。数量タグに true の値を持つエラー属性が含まれている場合、数量タグには以下にリストされている表のセルが表示されます。属性の値が true でない場合、xsl はタグ間のコンテンツを表示します。次の例では、error 属性が true でない場合、何も表示されません。
<xsl:choose> <xsl:when test="quantity[@error='true']"> <td bgcolor="#ffffff"><img height="1" width="1" src="http://img.sparks.com/images/i-catalog/sparks_images/sparks_ui/clearpixel.gif"/></td> <td valign="top" bgcolor="#ffffff" colspan="2"> <font face="verdana, arial" size="1" color="#cc3300"><b>*not enough in stock. your quantity was adjusted accordingly.</b> </font></td> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose>
for-each
<xsl:for-each select="package"> <xsl:apply-templates select="product"/> </xsl:for-each>
for-each 循环在程序遇到标签时开始。这个循环将在程序遇到标签时结束。一旦这个循环运行,每次标签出现时都会应用这个模板。
四、生成html
将来的某一时刻,浏览器将会集成xml解析引擎。到那时,你可以直接向浏览器发送xml和xsl文件,而浏览器则根据样式表中列出的规则显示xml数据。不过,在此之前开发者们将不得不在他们服务器端的系统里创建解析功能。
在sparks.com,我们已经在java servlet里集成了一个xml解析器。这个解析器使用一种称为xslt (xsl transformation)的机制,按xsl标签的说明向xsl模板中添加xml数据。
当我们的java servlet处理http请求时,servlet检索动态生成的xml,然后xml被传给解析引擎。根据xml文件中的指令,解析引擎查找适当的xsl样式表。解析器通过dom结构创建html文件,然后这个文件再传送给发出http请求的用户。
如果你选择使用sax模型,解析器会通读xml源程序,为每个xml标签创建一个事件。事件与xml数据对应,并最终按xsl标签向样式表中插入数据。
以上就是用XML和XSL来生成动态页面的内容,更多相关内容请关注PHP中文网(www.php.cn)!