XML と XSL を使用して動的ページを生成する

黄舟
リリース: 2017-03-30 17:11:13
オリジナル
1334 人が閲覧しました

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 の形式を変更する最も安全な方法は、タグを変更するのではなく追加することです。

XML データ形式の例を表示するにはここをクリックしてください

sparks.com では、さまざまな製品の表示に必要なすべての製品データを調べました。すべてのページがすべてのデータを使用するわけではありませんが、すべてのデータに適した非常に完全な XML データ形式を開発しました。たとえば、製品詳細ページには、製品参照ページよりも多くのデータが表示されます。ただし、各ページの xsl テンプレートは必要なフィールドのみを使用するため、どちらの場合でも同じデータ形式を使用します。

dtd を使用するかどうか

sparks.com では、単に正しい xml ではなく、よく整理された xml を使用します。前者は dtd を必要としないためです。 DTD は、ユーザーがクリックしてからページを表示するまでの間に処理レイヤーを追加します。このレイヤーには多大な処理が必要であることがわかりました。もちろん、XML 形式で他の企業と通信するときに DTD を使用するのは依然として良いことです。なぜなら、dtd は送受信時にデータ構造が正しいことを保証できるからです。

解析エンジンの選択

現在、いくつかの解析エンジンが利用可能です。どちらを選択するかは、ほぼ完全にアプリケーションのニーズによって決まります。 DTD を使用する場合は、解析エンジンが XML を DTD で検証できるようにする必要があります。検証を別のプロセスに入れることもできますが、パフォーマンスに影響を与えます。

sax と dom は 2 つの基本的な分析モデルです。 SAX はイベントベースであるため、XML が解析されるとイベントがエンジンに送信されます。次に、イベントが出力ファイルと同期されます。 DOM 解析エンジンは、動的 XML データと XSL スタイル シートの階層ツリー構造を確立します。 DOM ツリーにランダムにアクセスすることで、あたかも XSL スタイルシートで決定されたかのように XML データを提供できます。 SAX モデルに関する議論は主に、DOM 構造の過剰なメモリ削減と XSL スタイル シートの解析時間の高速化に焦点を当てています。

しかし、sax を使用する多くのシステムがその機能を十分に活用していないことがわかりました。これらのシステムは、これを使用して DOM 構造を構築し、DOM 構造を通じてイベントを送信します。このアプローチでは、XML 処理の前にスタイルシートから DOM を構築する必要があるため、パフォーマンスが低下します。

2. 動的 XML を生成する

XML 形式が確立されたら、それをデータベースから動的に移植できるメソッドが必要です。

XML ドキュメントの生成は、文字列を処理できるシステムのみが必要なため、比較的簡単です。 Javaサーブレット、enterPRise Javabeanサーバー、jdbc、rdbms(リレーショナルデータベース管理システム)を使用してシステムを構築しました。

• サーブレットは、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() は、 タグを生成して製品ノードを作成します。次に、internalxml() を呼び出し、製品 XML に必要なコンテンツを提供します。 innerxml() は、一連の stringbuffer.append() 呼び出しです。文字列バッファも文字列に変換され、コントロール メソッドに返されます。

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= 属性は名前空間のバージョン番号を定義します。ファイルの最後でタグを閉じます。

で始まるコードの 2 行目は、xsl テンプレートのモードを決定します。 match 属性は必須であり、ここでは XML タグ を指します。私たちのシステムでは、 タグに タグが含まれているため、xsl テンプレートは タグに埋め込まれた製品情報にアクセスできます。もう一度、ファイルの最後にある タグを閉じる必要があります。

次に、よく整理された 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
タグは、従来のプログラミング言語の if-then-else 構造の始まりに似ています。 XSL では、choose タグは、コードが入る部分で、割り当てによってアクションがトリガーされることを示します。属性が割り当てられた タグは、choose タグの後に続きます。割り当てが正しい場合、 の開始タグと終了タグの間の内容が使用されます。割り当てが間違っている場合は、 の開始タグと終了タグの間の内容が使用されます。セクション全体を で終了します。

この例では、when タグは数量タグの XML をチェックします。数量タグに true の値を持つエラー属性が含まれている場合、数量タグには以下にリストされている表のセルが表示されます。属性の値が true でない場合、xsl はタグ間のコンテンツを表示します。次の例では、error 属性が true でない場合、何も表示されません。

<xsl:choose>
<xsl:when test="quantity[@error=&#39;true&#39;]">
<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
タグを使用すると、同様の XML データの複数の状況に同じスタイル シートを適用できます。私たちにとって、一連の製品情報をデータベースから取り出して、Web ページ上で統一的にフォーマットすることができます。以下に例を示します:

<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)!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート