在sparks.com,我们运用xml来规范化从java对象到html数据显现等差别体系之间的数据示意。
迥殊须要指出的是,我们发明,只要以异常基础的xml构造来完成规范化,就可以更容易地同享和操纵数据。在这一历程当中,我们发明了运用xml的许多有用要领。下面细致引见我们如今的运用状况。
规范化
在运用xml之前,竖立与你要运用的信息差别的xml数据花样。
生成动态xml
从数据库中生成html并不新颖,但生成xml却很新颖。这里我们引见详细的生成步骤。
用xsl作为模板言语
xsl(可扩大样式表言语)是定义xml数据显现花样的好要领,假如写成几个静态模板会更有用。
生成html
xml加上xsl就即是html。这听起来好像不对,但用户所见的我们的html页面实在就是xml和xsl配合发作的结果。
一、规范化
xml的才能来自于它的灵活性。但不幸的是,它偶然太灵活了,以至于你会面临一个空缺的页面,忧愁该怎样处置惩罚题目。
在任何xml的项目中,第一步事情都是建立规范的数据花样。为此你要作出以下决议:
要触及哪些数据
是不是要运用dtd(文件范例定义)
是不是要运用dom(文档对象模子)或sax(xml的简化api)剖析
肯定数据:
因为没有规范的xml花样,开辟者可以自由地开辟自身的花样。但是,假如你的花样只能被一个运用顺序辨认,那末你只能运转这个顺序来运用该花样。假如另有其他顺序也能读懂你的xml花样,那显然会更有协助。假如某个xml花样被修正,则运用它的体系可以也须要被修正,所以你应当竖立尽量完整的花样。因为大多数体系疏忽它们没法辨认的标签,所以转变一个xml花样的最平安的要领是增加标签,而不是修正标签。
单击此处检察xml数据花样实例
在sparks.com,我们检察了差别的产物展现须要的一切产物数据。只管并非一切的页面都运用悉数数据,但我们照样由此开辟出适用于一切数据的异常完整的xml数据花样。比方,我们的产物明细信息页面显现的数据要比产物阅读页面多。但是,我们在这两种状况下依然运用雷同的数据花样,因为每一个页面的xsl模板都只运用它所须要的字段。
是不是运用dtd
在sparks.com,我们运用构造优越的xml,而不运用仅仅是准确的xml,因为前者不须要dtd。dtd在用户点击和看到页面之间加入了一个处置惩罚层。我们发明这一层须要太多的处置惩罚。固然,在以xml花样与其他公司通讯时,运用dtd照样很不错的。因为dtd能在发送和接收时能保证数据构造准确。
挑选剖析引擎
如今,可以运用的剖析引擎有好几个。挑选哪个险些完整取决于你的运用须要。假如你决议运用dtd,那末这个剖析引擎必须能使你的xml被dtd考证。你可以将考证另放到一个历程中,但那样会影响机能。
sax和dom是两个基础的剖析模子。sax基于事宜,所以在xml被剖析时,事宜被发送给引擎。接下来,事宜与输出文件同步。dom剖析引擎为动态xml数据和xsl样式表竖立条理树状构造。经由历程随机接见dom树,可以供应xml数据,就象由xsl样式表来决议一样。sax模子上的争辩重要集中于对dom构造的内存下落过分和加速xsl样式表剖析时候收缩方面。
但是,我们发明运用sax的许多体系并没有充分发挥它的才能。这些体系用它来竖立dom构造并经由历程dom构造来发送事宜。用这类要领,在任何xml处置惩罚之前必须从样式表中竖立dom,所以机能会下落。
二、生成动态xml
一旦竖立了xml花样,我们须要一种可以将其从数据库中动态移植的要领。
生成xml文档相对来讲比较简单,因为它只须要一个可以处置惩罚字符串的体系。我们竖立了一个运用java servlet、enterprise javabean server、jdbc和rdbms(关联型数据库治理体系)的体系。
servlet经由历程把生成xml文档的使命交给enterprise javabean (ejb)来处置惩罚产物信息要求。
ejb运用jdbc从数据库里查询所需的产物细致信息。
ejb生成xml文件并把它传递给servlet。
servlet挪用剖析引擎,从xml文件和静态的xsl样式表中建立html输出。 (有关xsl运用的其他信息,请参阅用xsl作为模板言语。)
生成xml的例子
在java中建立xml文档字符串的真正代码可以分红几个要领和类。
启动xml生成历程的代码放在ejb要领里。这一实例会马上建立一个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()变元自身就是对其他要领的挪用。
发作文件头
第一个附加要领挪用xmlutils类来发作xml文件头。我们的java servlet中的代码以下:
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文件头。<?xml>标签把本文件定义为支撑1.0版本的xml文件。第二行代码指向用以显现数据的准确样式表的位置。末了包括进去的是项级标签(本实例中为<browse>)。在文件末端,只要<browse>标签须要被封闭。
<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>
填入产物信息
完成了文件头后,掌握要领会挪用java对象来发作它的xml。本例中挪用的是product对象。product对象运用两个要领来发作它的xml示意。第一个要领toxml()经由历程发作<product>和</product>标签来竖立product节点。然后它会挪用internalxml(),如许就可以供应产物xml所需的内容。internalxml()是一系列的stringbuffer.append()挪用。stringbuffer也被转换成字符串并返回给掌握要领。
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文件。来自掌握要领的全部stringbuffer也转换成字符串,并返回给处置惩罚最初http要求的servlet。
三、用xsl作为模板言语
为了获得html输出,我们把生成的xml文件和掌握xml数据怎样示意的xsl模板相结合。我们的xsl模板由精心构造的xsl和html标签构成。
最先建模板
我们的xsl模板最先部份与下面这段代码类似。第一行代码为必须代码,将本文件定义为xsl样式表。xmlns:xsl=属性援用本文件所运用的xml称号空间,而version=属性则定义称号空间的版本号。在文件的末端,我们封闭标签。
由<xsl:template>最先的第二行代码肯定了xsl模板的形式。match属性是必须的,在这里指向xml标签<basketpage>。在我们的体系里,<basketpage>标签里包括<product> 标签,这使得xsl模板可以接见嵌在<product>标签内的产物信息。我们又一次必须在文件末端封闭<xsl:template>标签。本文来自http://bianceng.cn(编程入门)
接下来,我们来看一看构造优越的html。因为它将被xml剖析引擎处置惩罚,所以必须相符构造优越的xml的一切划定规矩。从本质上来讲,这意味着一切的最先标签必须有对应的完毕标签。比方,一般不被完毕的<p>标签,必须用</p>封闭。
<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标签被用于为数据示意供应逻辑。下面诠释两个经常使用的标签。
choose
<xsl:choose>标签类似于传统编程言语中if-then-else构造的最先部份。在xsl中,choose标签示意在代码进入的部份中,赋值将触发行动的发作。具有赋值属性的<xsl:when>标签跟在choose标签背面。假如赋值是准确的,位于<xsl:when>的最先和完毕标签之间的内容将被运用。假如赋值毛病,就运用<xsl:otherwise>的最先和完毕标签之间的内容。全部部份用</xsl:choose>来完毕。
在这个例子里,when标签会为quantity标签搜检xml。假如quantity标签里含有值为真的error属性,quantity标签将会显现列鄙人面的表格单位。假如属性的值不为真,xsl将会显现otherwise标签间的内容。鄙人面的实例里,假如error属性不真,则什么都不会被显现。
<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>标签可以用来对类似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生成动态页面的代码详解的细致内容,更多请关注ki4网别的相干文章!