用XML和XSL来生成动态页面
xml(可扩展标记语言🔹)看起来可能像【kě néng xiàng】🌘某种w3c标准🐦——现在没有什么【yǒu shí me】实际影【shí jì yǐng】响【xiǎng】,即使以【jí shǐ yǐ】😊后能派上用场【shàng yòng chǎng】🏇,也是很🛌久以后的【de】事🍼。但实际上,它【tā】现在🌐已经得到【dào】🏋了应用【le yīng yòng】。所以【suǒ yǐ】🌯,不要等到【dào】🏋xml已被加【yǐ bèi jiā】🔇进了你最喜爱的【de】html编辑器中才开始使用它【tā】。它【tā】现在🌐就可以解决各种内部【zhǒng nèi bù】🕑问题🎮和b2b系统问题🎮。
在【zài】sparks.com,我们使🌙用xml来标准【lái biāo zhǔn】化从🔘java对象到【duì xiàng dào】html数据显【shù jù xiǎn】示等不同系统🍯之间的🚸数据表示。
特别需要指出【yào zhǐ chū】的是😯,我们发【wǒ men fā】🗿现【xiàn】,只要以【zhī yào yǐ】非常基🏒本的【běn de】xml结构来实现【xiàn】标准化,就可以【jiù kě yǐ】更容易地共享和操作数据📉。在这一过程中,我们发【wǒ men fā】🗿现【xiàn】了使用【yòng】xml的很多🔒有效方【yǒu xiào fāng】法🥜。下面详😎细介绍【xì jiè shào】🥪我们现【xiàn】在的应用【yòng】情况🗺。
标准化
在使用【zài shǐ yòng】xml之前,建立与你要使【nǐ yào shǐ】用的信息不同🤑的xml数据格【shù jù gé】👢式📔。
生成【chéng】动🐌态xml
从数据【cóng shù jù】库中生【kù zhōng shēng】💎成【chéng】html并不新鲜【xiān】🔩,但生成【chéng】xml却很新👻鲜【xiān】🔩。这里我们介绍【men jiè shào】具体的生成【chéng】步骤。
用【yòng】xsl作为模板语言
xsl(可扩展🎬样式表✈语言)是定义🦗xml数据显示格式的好方【de hǎo fāng】法🛐,如果写【rú guǒ xiě】👊成几个【chéng jǐ gè】静态模【jìng tài mó】板会更有效。
生成html
xml加上xsl就等于html。这听起【zhè tīng qǐ】来似乎不对🎋,但用户所见的【suǒ jiàn de】🕯我们的【wǒ men de】🏻html页面其【yè miàn qí】🏟实就是📣xml和xsl共同产生的效果【guǒ】。
一、标准化
xml的能力🛵来自于它的灵活性🌙。但不幸的是,它有时💌太灵活【tài líng huó】了【le】🚣,以至于你会面对一个【duì yī gè】空白的页面【yè miàn】🕳,发愁该【fā chóu gāi】怎么解👧决问题【jué wèn tí】。
在任何【zài rèn hé】xml的项目中🌎,第一步🐐工作都🌼是创建标准的数据格式【shì】🔩。为此你要作出以下决【yǐ xià jué】定【dìng】:
• 要涉及哪些数据
• 是否要使用【shǐ yòng】dtd(文件类⬇型定义【xíng dìng yì】)
• 是否要使用【shǐ yòng】dom(文档对🚉象模型【xiàng mó xíng】💏)或🕥sax(xml的简化【de jiǎn huà】api)解析【jiě xī】💰
确定数据:
因为没有标准【yǒu biāo zhǔn】🚲的xml格式【gé shì】👌,开发者【kāi fā zhě】可以自⛩由地开👹发自己【fā zì jǐ】的格式【gé shì】⏯。然而【rán ér】,如果你✒的格式【gé shì】⏯只能被一个应♉用程序【yòng chéng xù】识别,那么你只能运行这个程序来【chéng xù lái】使用该格式【gé shì】👌。如果还有其他程序也能读懂【néng dú dǒng】⤵你的【nǐ de】xml格式【gé shì】👌,那显然【nà xiǎn rán】👋会更有帮助【bāng zhù】。如果某个xml格式【gé shì】被🍓修改【xiū gǎi】,则使用它的系【tā de xì】统可能【tǒng kě néng】🍡也需要🚘被修改【bèi xiū gǎi】,所以你🥠应该建立尽可🐹能完整【néng wán zhěng】的格式【gé shì】⏯。因为大多数系统忽略😵它们无法识别的标签【de biāo qiān】🚚,所以改【suǒ yǐ gǎi】变一个⚫xml格式【gé shì】👌的最安全的方【quán de fāng】法是添加标签,而不是修改【xiū gǎi】标签。
单击此处查看xml数据格式实例
在😼sparks.com,我们查🌬看了不同的产【tóng de chǎn】🔅品展示需要的🚅所有产⭕品数据。尽管并📘不是所有的页面都使【miàn dōu shǐ】用全部数据,但我们还是由此开发【cǐ kāi fā】出适用【chū shì yòng】于所有数据的非常完🤯整的😴xml数据格式。例如,我们的产品明细信息页面显【yè miàn xiǎn】🚶示的数【shì de shù】据要比产品浏【chǎn pǐn liú】💷览页面【lǎn yè miàn】🧘多【duō】。然而,我们在【wǒ men zài】🐝这两种🤖情况下【qíng kuàng xià】仍然使用相同的数据【de shù jù】格式,因为每【yīn wéi měi】🐎个页面的xsl模板都只使用【zhī shǐ yòng】它所需【tā suǒ xū】🌉要的字段。
是否使🐿用【yòng】dtd
在【zài】🈹sparks.com,我们使【wǒ men shǐ】用【yòng】🅿组织良【zǔ zhī liáng】好的【hǎo de】🗜xml,而不使【ér bú shǐ】用【yòng】🅿仅仅是正确的xml,因为前【yīn wéi qián】者不需🗣要【yào】🗑dtd。dtd在【zài】🈹用【yòng】户点击和看到页面之间加入了【rù le】😮一个处理层。我们发【wǒ men fā】现这一层需要【yào】🗑太多的处理。当然,在【zài】🈹以xml格式与🔩其他公【qí tā gōng】🌾司通信【sī tōng xìn】时【shí】,使用【yòng】🅿dtd还是很【hái shì hěn】不错的🔈。因为dtd能在【zài】发🧡送和接受时【shí】能保证数🏄据结构正确。
选择解析引擎💰
现在【xiàn zài】,可以使用【yòng】的解析引擎💰有好几🔫个【gè】🗂。选择哪😡一个【yī gè】🗂几乎完【jǐ hū wán】全取决于你的应🔢用需要【yòng xū yào】。如果你【rú guǒ nǐ】🎦决定使😿用【yòng】dtd,那么这个【gè】🗂解析引擎💰必须能【bì xū néng】使你的xml被【bèi】🌸dtd验证【yàn zhèng】。你可以【nǐ kě yǐ】🛷将验证【yàn zhèng】另放到一个【yī gè】🗂进程中,但那样会影响🕢性能。
sax和dom是两个😕基本的【jī běn de】解析模【jiě xī mó】型。sax基于事【jī yú shì】件【jiàn】,所以在💯xml被解析时【shí】🏛,事件【jiàn】被发送给引擎【yǐn qíng】🍫。接下来💑,事件【jiàn】与输出文件同步【jiàn tóng bù】。dom解析引❣擎为动态xml数据【shù jù】和🍹xsl样式表【yàng shì biǎo】建立层【jiàn lì céng】🧛次树状【cì shù zhuàng】结构。通过随机访问dom树,可以提供xml数据【shù jù】🅾,就象由✡xsl样式表【yàng shì biǎo】来决定⛱一样。sax模型上【mó xíng shàng】🌫的争论主要集👣中于对【zhōng yú duì】dom结构的内存降【nèi cún jiàng】低过度【dī guò dù】💘和加快xsl样式表【yàng shì biǎo】解析时【shí】🏛间缩短方面🐱。
然而,我们发现使用sax的很多【de hěn duō】🏊系统并没有充🕋分发挥它的能🕺力。这些系统用它来建立【lì】🐔dom结构并【jié gòu bìng】通过dom结构来发送事件【jiàn】。用这种【yòng zhè zhǒng】方法【fāng fǎ】🍢,在任何【zài rèn hé】xml处理之🐁前必须⬅从样式【cóng yàng shì】♈表中建立【lì】dom,所以性能会下⛑降【jiàng】。
二、生成动态xml
一旦建【yī dàn jiàn】☝立了🌒xml格式,我们需【wǒ men xū】要一种能够将其从数据库中【jù kù zhōng】动态移【dòng tài yí】🥨植的方法🀄。
生成【shēng chéng】xml文档相对来说【duì lái shuō】🆚比较简【bǐ jiào jiǎn】单【dān】,因为它只需要一个可以处理🐛字符串❤的系统🕒。我们建立了一【lì le yī】🎾个使用java servlet、enterprise javabean server、jdbc和【hé】rdbms(关系型数据库管理系统🚐)的系统🕒。
• servlet通过把生成【shēng chéng】📏xml文档的【wén dàng de】🛡任务交🙌给enterprise javabean (ejb)来处理产品信【chǎn pǐn xìn】📝息请求。
• ejb使用【shǐ yòng】jdbc从数据库里查询所需【xún suǒ xū】的产品🙏详细信息。
• ejb生成【shēng chéng】📏xml文件并把它传递给servlet。
• servlet调用解【diào yòng jiě】🎻析引擎😌,从xml文件和😇静态的【jìng tài de】xsl样式表中创建html输出【shū chū】🖥。
(有关xsl应用的其他信【qí tā xìn】🥏息🛒,请参阅【qǐng cān yuè】用xsl作为模板语言【bǎn yǔ yán】🦍。)
生成xml的例子
在【zài】🐸java中创建xml文档字👸符串的真正代🎮码可以分成几【fèn chéng jǐ】个方法【gè fāng fǎ】😌和类【hé lèi】。
启动🏣xml生成过🔊程的代【chéng de dài】码放在【mǎ fàng zài】🏛ejb方法里。这一实【zhè yī shí】例会立即创建一个【yī gè】🍑stringbuffer,以便存储生成的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());
后面的🌚三个xml.append()变元本身就是【shēn jiù shì】对其他🏤方法的👃调用【diào yòng】。
产生【chǎn shēng】⛔文件头
第一个【dì yī gè】⏰附加方法调用【fǎ diào yòng】xmlutils类来产生【chǎn shēng】⛔xml文件头。我们的java servlet中的代【zhōng de dài】码如下🚖:
public static string begindocument(string stylesheet, string page)
{
stringbuffer xml = new stringbuffer();
xml.append("\n")
.append(" .append(stylesheet).append("\"")
.append(" type =\"text/xsl\"?>\n");
xml.append("<").append(page).append(">\n");
return xml.tostring();
}
这段代【zhè duàn dài】码生成了【le】xml文件头【wén jiàn tóu】。标签把📌本文件【běn wén jiàn】定义为🚼支持【zhī chí】🍦1.0版本的xml文件。第二行✴代码指向用以【xiàng yòng yǐ】🕍显示数据的正确样式表的位🐫置。最后包括进去的是项级标签(本实例🍯中为【zhōng wéi】
)。在文件末尾【mò wěi】,只有🌖
标签需要被关【yào bèi guān】闭🌖。
填入产【tián rù chǎn】品【pǐn】❌信息
完成了【wán chéng le】文件头后🤽,控制方法【fǎ】会调🚩用【yòng】java对象🛁来产生【shēng】它🔧的【de】🔃xml。本例中调用【yòng】的【de】🔃是【shì】product对象🛁。product对象🛁使用两【shǐ yòng liǎng】个方法【fǎ】来🚃产生【shēng】它🔧的【de】🔃xml表示【biǎo shì】。第一个方法【fǎ】toxml()通过产🌪生【shēng】🤶<product>和</product>标签来【biāo qiān lái】建立product节点【jiē diǎn】。然后【rán hòu】🤽它会调用【yòng】internalxml(),这样就能提供产品【pǐn】❌xml所需的【de】🥦内容【nèi róng】🎺。internalxml()是【shì】一系列的【de】🔃stringbuffer.append()调用【yòng】。stringbuffer也被转🍗换成字📽符串并返回给🦒控制方法【fǎ】。
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");
厖【máng】🗑?
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";
厖【máng】🗑?
return xml.tostring();
}
关闭文件【wén jiàn】
最后【zuì hòu】🥛,xmlutils.enddocument()方法被【fāng fǎ bèi】🧀调用【diào yòng】🦁。这个调用【diào yòng】🦁关闭xml标签🏪(本例中🌳为),并最终完成架🧔构好的xml文件【wén jiàn】。来自控【lái zì kòng】制方法🆙的整个stringbuffer也转换成字符【chéng zì fú】串,并返回给处理【gěi chù lǐ】🚅最初http请求的servlet。
三、用xsl作为模板语言
为了得到html输出🔲,我们把🔭生成【shēng chéng】🕤的xml文件和【wén jiàn hé】控制【kòng zhì】xml数据如【shù jù rú】何表示的xsl模板相结合【jié hé】。我们的💇xsl模板由【mó bǎn yóu】精心组📨织的🌕xsl和html标签组成🕤。
开始建模板【mó bǎn】
我们的xsl模板【mó bǎn】开始部分🐿与下面🎬这段代🥔码类似👰。第一行🎀代码【dài mǎ】📩为【wéi】🎒必需代码【dài mǎ】📩,将本文件定义为【wéi】🎒xsl样式表。xmlns:xsl=属性引用本文件所使【jiàn suǒ shǐ】用的【yòng de】xml名称空【míng chēng kōng】🈂间,而version=属性则定义名称空【míng chēng kōng】🈂间的版本号【běn hào】🤴。在文件的末尾,我们关🗞闭标签【bì biāo qiān】。
由<xsl:template>开始的【kāi shǐ de】➖第二行【dì èr háng】代码确【dài mǎ què】定了xsl模板的模式。match属性是【shǔ xìng shì】必需的,在这里【zài zhè lǐ】🍻指向xml标签【biāo qiān】📸<basketpage>。在我们➖的系统【de xì tǒng】里,<basketpage>标签【biāo qiān】里🤚包含<product> 标签【biāo qiān】📸,这
关键词🤟:XML,XSL,动态页面🕳
阅读本文后您有什么感想? 已有 人给出评价!
- 1
- 1
- 1
- 1
- 1
- 1