分享
 
 
 

Web开发框架中的架构模式比较(三)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

页面内容和表现风格的分离,(XSLT)

页面内容和表现风格分离的第一步,是CSS风格文件和HTML页面的分离,但是,HTML的页面内容和显示元素还是紧紧捆绑在一起。XML推广之后,XSLT也大行其道,大量地应用在web发布系统中。ASP.Net和java web框架都在朝这个方向走,只是java web框架走得更快,更远。下面进行说明。

在处理XSLT时,SAX接口要比DOM接口快得多,而且几乎不占据内存空间。令人不安的是,.Net框架到现在还没有提供SAX接口。微软提供了一套MSXML SDK,其中包含了基于COM组件的SAX实现,并提供了在VB和VC中应用的实例。MSXML SAX的VC用例中,需要包含头文件msxml2.h。这就是说,.Net框架无法以一种自然的方式调用MSXML SAX。还有,.Net框架的XSLT是如何实现的,即,System.Xml.Xsl.XslTransform是用什么方式实现的,是调用SAX接口,还是DOM接口。如何使用.Net框架组成一条XSLT的处理管道?我也找不到方法。也没有发现这方面的例子。

Apache Xerce项目支持XML处理,提供Java和C++版本,并提供了调用MSXML的封装;Apache Xalan项目支持XSLT处理;Apache Cocoon2.0,使用SAX接口,组成XSLT的处理管道。

Apache Xalan项目的一个例子文件UseXMLFilters.java

UseXMLFilters.java。(节录,文件头部分省略)

public class UseXMLFilters

{

public static void main(String[] args)

throws TransformerException, TransformerConfigurationException,

SAXException, IOException

{

// Instantiate a TransformerFactory.

TransformerFactory tFactory = TransformerFactory.newInstance();

// Determine whether the TransformerFactory supports The use uf SAXSource

// and SAXResult

if (tFactory.getFeature(SAXSource.FEATURE) && tFactory.getFeature(SAXResult.FEATURE))

{

// Cast the TransformerFactory to SAXTransformerFactory.

SAXTransformerFactory saxTFactory = ((SAXTransformerFactory) tFactory);

// Create an XMLFilter for each stylesheet.

XMLFilter xmlFilter1 = saxTFactory.newXMLFilter(new StreamSource("foo1.xsl"));

XMLFilter xmlFilter2 = saxTFactory.newXMLFilter(new StreamSource("foo2.xsl"));

XMLFilter xmlFilter3 = saxTFactory.newXMLFilter(new StreamSource("foo3.xsl"));

// Create an XMLReader.

XMLReader reader = XMLReaderFactory.createXMLReader();

// xmlFilter1 uses the XMLReader as its reader.

xmlFilter1.setParent(reader);

// xmlFilter2 uses xmlFilter1 as its reader.

xmlFilter2.setParent(xmlFilter1);

// xmlFilter3 uses xmlFilter2 as its reader.

xmlFilter3.setParent(xmlFilter2);

// xmlFilter3 outputs SAX events to the serializer.

Serializer serializer = SerializerFactory.getSerializer

(OutputProperties.getDefaultMethodProperties("xml"));

serializer.setOutputStream(System.out);

xmlFilter3.setContentHandler(serializer.asContentHandler());

// Perform the series of transformations as follows:

// - transformer3 gets its parent (transformer2) as the XMLReader/XMLFilter

// and calls transformer2.parse(new InputSource("foo.xml")).

// - transformer2 gets its parent (transformer1) as the XMLReader/XMLFilter

// and calls transformer1.parse(new InputSource("foo.xml")).

// - transformer1 gets its parent (reader, a SAXParser) as the XMLReader

// and calls reader.parse(new InputSource("foo.xml")).

// - reader parses the XML document and sends the SAX parse events to transformer1,

// which performs transformation 1 and sends the output to transformer2.

// - transformer2 parses the transformation 1 output, performs transformation 2, and

// sends the output to transformer3.

// - transformer3 parses the transformation 2 output, performs transformation 3,

// and sends the output to the serializer.

xmlFilter3.parse(new InputSource("foo.xml"));

}

}

}

Apache Cocoon项目的一个配置文件例子sitemap.xmap

Apache Cocoon项目的sitemap.xmap定义了XSLT处理管道。见下例中的<map:handle-errors>部分,错误信息经过两次XSLT处理," error2document.xsl" 和"apache.xsl"。

/sample/tutorial/sitemap.xmap (节录,无关部分省略)

<map:pipelines>

<map:pipeline>

<map:match pattern="*-dept.xml">

<map:act set="process">

<map:parameter name="descriptor" value="context://tutorial/docs/department-form.xml"/>

<map:generate type="serverpages" src="docs/confirm-dept.xsp"/>

<map:serialize type="xml"/>

</map:act>

<map:generate type="serverpages" src="docs/{1}-dept.xsp"/>

<map:serialize type="xml"/>

</map:match>

...

<map:handle-errors>

<map:transform src="stylesheets/system/error2document.xsl"/>

<map:transform src="stylesheets/apache.xsl"/>

<map:serialize status-code="500"/>

</map:handle-errors>

</map:pipeline>

...

</map:pipelines>

ASP.Net的Xml Web控件例子

下面的示例从.Net框架文当中摘录,说明如何使用 Xml 控件通过示例 XSL 转换文件来显示示例 XML 文件。示例 XML 文件名为 People.xml,示例 XSL 转换文件名为 Peopletable. xsl。可以看到,asp:Xml控间只能进行一步XSLT转换。

<html>

<body>

<h3>Xml Example</h3>

<form runat="server">

<asp:Xml id="xml1"

DocumentSource="people.xml"

TransformSource="peopletable.xsl"

runat="server" />

</form>

</body>

</html>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有