ホームページ  >  記事  >  バックエンド開発  >  XMLとXSLを使用して動的ページを生成するコードの詳細な説明

XMLとXSLを使用して動的ページを生成するコードの詳細な説明

黄舟
黄舟オリジナル
2017-03-28 17:00:072024ブラウズ

xml (Extensible Markup Language) は、ある種の w3c 標準のように見えるかもしれません。現時点では実質的な影響はほとんどなく、たとえ後で役立つようになったとしても、それはずっと先のことになります。しかし、実際にはすでに使われているのです。したがって、xml がお気に入りの htmlエディター に追加されるまで待たずに使用を開始してください。今すぐさまざまな問題を解決できます。

sparks.com では、javaオブジェクトから HTML データ表示まで、さまざまなシステム間でのデータ表現を標準化しています

特に、データの共有と操作が容易であることがわかりました。非常に基本的な XML 構造で標準化されている限り、XML を使用する多くの効果的な方法を発見しました。ここでは、現在のアプリケーションについて詳しく説明します。xml を使用する前に、次の XML データ形式を作成します。使用したい情報とは異なります。

動的 XML を生成する

データベースから HTML を生成することは新しいことではありませんが、ここでの XML 生成手順は新しいです。

テンプレート言語として xsl を使用する

xsl (Extensible Stylesheet)。 Language) は、複数の

static

template

generate htmlxml として記述するとより効率的です。これは正しくないかもしれません。しかし、ユーザーに表示される HTML ページは、実際には xml と xsl の組み合わせの結果です。

xml の標準化機能は、残念なことに、非常に柔軟であるため、空白に直面することがあります。

どの XML プロジェクトでも、最初のステップは、次の決定を行うことです:

どのデータを含めるか

dtd (

dom (ドキュメント オブジェクト モデル) を使用するか、sax (xml 用の簡易 API) 解析を使用するか

データを決定する:

なぜなら、標準の XML 形式はなく、開発者は独自の形式を自由に開発できるからです。あなたの形式が 1 つのアプリケーションでのみ認識される場合、その形式を読み取ることができる他のプログラムが存在する場合にのみ、その形式を使用することができます。ほとんどのシステムはタグを無視し、認識できないため、XML 形式を変更する最も安全な方法は、タグを変更するのではなく、タグを追加することです。

ここをクリックして XML データ形式の例を確認してください

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

dtd を使用するかどうか

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

解析エンジンを選択してください

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

sax と dom は 2 つの基本的な分析モデルです。 Sax は

events

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

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

2. 動的 XML を生成する

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

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

サーブレットは、XML ドキュメントを生成するタスクをエンタープライズ Javabean (ejb) にオフロードすることにより、製品情報リクエストを処理します。

ejb は jdbc を使用して、データベースから必要な製品の詳細をクエリします。

ejbはxmlファイルを生成し、それをサーブレットに渡します。

サーブレットは解析エンジンを呼び出して、xml ファイルと静的 xsl スタイル シートから html 出力を作成します。 (使用に関する追加情報については、

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 ファイル ヘッダーを生成します。 8a82eb472d64dd53782fcc091813a312 タグは、このファイルをバージョン 1.0 をサポートする XML ファイルとして定義します。コードの 2 行目は、データを表示するための正しいスタイル シートの場所を指します。最後に含まれるのは項目レベルのタグ (この例では 86d47457b1f44f493b73b959a822e430) です。ファイルの最後では、86d47457b1f44f493b73b959a822e430 タグのみを閉じる必要があります。

<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>

製品情報を入力してください

ファイルヘッダーの完成後、コントロールメソッドは Java オブジェクトを呼び出して XML を生成します。この例では、product オブジェクトが呼び出されます。製品オブジェクトは 2 つのメソッドを使用して XML 表現を生成します。最初のメソッド toxml() は、08666523c48e252879f3381a68d5de0a タグを生成して製品ノードを作成します。次に、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= 属性は名前空間のバージョン番号を定義します。ファイルの最後でタグを閉じます。 2032d1f3e843089f381a035edc734156 で始まるコードの 2 行目は、xsl テンプレートのモードを決定します。 match 属性は必須であり、ここでは XML タグ 34ab9008638189d20e962c822c883981 を指します。私たちのシステムでは、34ab9008638189d20e962c822c883981 タグに a719999c5224e00a42ab5e276e57a41b タグが含まれているため、xsl テンプレートは a719999c5224e00a42ab5e276e57a41b タグに埋め込まれた製品情報にアクセスできます。もう一度、ファイルの最後にある 2032d1f3e843089f381a035edc734156 タグを閉じる必要があります。この記事は http://bianceng.cn (プログラミング入門) からのものです

次に、よく構成された HTML を見てみましょう。 XML 解析エンジンによって処理されるため、適切に構成された XML のすべてのルールに準拠する必要があります。基本的に、これはすべての開始タグに対応する終了タグが必要であることを意味します。たとえば、通常は閉じられない e388a4556c0f65e1904146cc1a846bee タグは、94b3e26ee717c64999d7867364b1b4a3 で閉じる必要があります。

<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

3e08d16b69ca6dceb52122b5e3e896ec タグは、従来の

プログラミング言語

if

-then-else 構造の先頭に似ています。 XSL では、choose タグは、コードが入る部分で、割り当てによってアクションがトリガーされることを示します。属性が割り当てられた 1aab2a36c3da35537dba594d8b9f335a タグは、choose タグの後に続きます。割り当てが正しい場合、1aab2a36c3da35537dba594d8b9f335a の開始タグと終了タグの間の内容が使用されます。割り当てが間違っている場合は、b490e3a477a758f8d417150b585fd42a の開始タグと終了タグの間の内容が使用されます。セクション全体を 0deb431ca822a5ae1672ac1bd025a592 で終了します。

    在这个例子里,when标签会为quantity标签检查xml。如果quantity标签里含有值为真的error属性,quantity标签将会显示列在下面的表格单元。如果属性的值不为真,xsl将会显示otherwise标签间的内容。在下面的实例里,如果error属性不真,则什么都不会被显示。

<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

431e46b64b4819f2ac967516fbb4b43f标签可以用来对相似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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。