Web開發框架中的架構模式比較(三) (轉)

worldblog發表於2007-12-14
Web開發框架中的架構模式比較(三) (轉)[@more@]

T)

頁面內容和表現風格分離的第一步,是CSS風格和HTML頁面的分離,但是,HTML的頁面內容和顯示元素還是緊緊捆綁在一起。推廣之後,XSLT也大行其道,大量地應用在釋出中。和 web都在朝這個方向走,只是java web框架走得更快,更遠。下面進行說明。

在處理XSLT時,SAX介面要比介面快得多,而且幾乎不佔據空間。令人不安的是,.Net框架到現在還沒有提供SAX介面。提供了一套MSXML SDK,其中包含了基於COM的SAX實現,並提供了在VB和VC中應用的例項。MSXML SAX的VC用例中,需要包含標頭檔案msxml2.h。這就是說,.Net框架無法以一種自然的方式MSXML SAX。還有,.Net框架的XSLT是如何實現的,即,System.Xml.Xsl.XslTranorm是用什麼方式實現的,是呼叫SAX介面,還是DOM介面。如何使用.Net框架組成一條XSLT的處理管道?我也找不到方法。也沒有發現這方面的例子。

Xerce專案支援XML處理,提供Java和C++版本,並提供了呼叫MSXML的封裝;Apache Xalan專案支援XSLT處理;Apache Cocoon2.0,使用SAX介面,組成XSLT的處理管道。

Apache Xalan專案的一個例子檔案UseXMLFilters.java

UseXMLFilters.java。(節錄,檔案頭部分省略)

microsoft-com::office" />

public class UseXMLFilters

{

  public static void main(String[] args)

  throws TransformerException, TransformerConfigurationException,

  SAXException, IOException   

  {

  // Instantiate  a TransformerFactory.

    TransformerFactory tFactory = TransformerFactory.newInstance();

  // Detene whether the TransformerFactory supports The use uf SAX

  // 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.antentHandler());

     // Perfothe 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處理管道。見下例中的部分,錯誤資訊經過兩次XSLT處理," error2document.xsl" 和"apache.xsl"。

/sample/tutorial/sitemap.xmap (節錄,無關部分省略)

 

 

 

 

 

 

 

 

...

 

 

 

 

 

 

...

 

的Xml Web例子

下面的示例從.Net框架文當中摘錄,說明如何使用 Xml 控制元件透過示例 XSL 轉換檔案來顯示示例 XML 檔案。示例 XML 檔名為 People.xml,示例 XSL 轉換檔名為 Peopletable. xsl。可以看到,asp:Xml控間只能進行一步XSLT轉換。

 

Xml Example

 

  <asp:Xml id="xml1"

  DocumentSource="people.xml"

  TransformSource="peopletable.xsl"

  runat="server" />

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993462/,如需轉載,請註明出處,否則將追究法律責任。

相關文章