DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 通過XSLT訪問Java代碼
通過XSLT訪問Java代碼
編輯:XML詳解     

假如你希望將XML數據轉換為固定寬度和純文本的字符串——這剛好是XSLT不太方便實現的一個特性,或者,也許你希望在XML文件中執行詞語替換。在這些情況下,當你的事務超出了XSLT自身的處理能力時,可以通過在你的XSLT處理器中調用Java函數來完成。

  我看到過利用類似VBScript和JScript的腳本語言完成特殊處理的例子(針對微軟解析器的),但是如何利用Java來執行特殊的處理還不是特別地明顯。盡管如此,簡單地說,可以在XSLT處理器中通過XML命名空間(namespaces)調用Java函數來實現。Java與XSLT的結合為構建健壯的應用程序提供了強有力的方法。

  使用定制的命名空間

  命名空間是通過使用統一資源標識符(URI)來修飾限定XSL中元素和屬性名稱的一種方法。例如,常見的XSL元素需要有xsl命名空間前綴來修飾,xsl通過使用XSLT命名空間URI來聲明:

XMLns:xsl="http://www.w3.org/1999/XSL/Transform"

  但是並不局限於使用XSLT命名空間,你完全可以自由地聲明你自己定制的命名空間,並用它們來識別定制的XSLT標簽和范圍。

  你必須使用定制的命名空間前綴來完成對外部函數的調用,例如,mynspace:fundtion(),該命名空間前綴mynspace,必須與一個命名空間URI相關聯,例如:

xmlns:myspace="d:///XMLprogs/mynamespace"

  一般的Java綁定使用命名空間URI標識Java類函數的位置。對用於本文示例代碼的Xalan XSLT處理器(版本1.2.2)來說,命名空間URI必須具有URI-stem/packagename的形式。如果你使用了XT,那麼你的命名空間應該有如下格式:

xmlns:mynspace="d://XMLprogs/mynamespace.myclassname

這種情況下,你可以使用XSLT代碼調用來自myclassname的Java函數。

  綁定外部Java函數

  此處給出在XSLT模板內部綁定Java語言編寫的外部函數的過程。

  將你自己定制的命名空間作為它們的屬性添加到樣式表(stylesheet)元素或者你的模板中。

  確保你的Java類文件所在目錄位於你的XSLT處理器所運行的Java虛擬機(JVM)的CLASSPATH中。

  對於靜態方法,可以使可以用完全合格的類名稱加上方法和任何必需的的參數,當然還有命名空間前綴。

  對於非靜態方法,首先創建類實例,然後調用該方法並提供任何必需的參數。

  例如,下面的樣式表元素包含一個定制的命名空間聲明:

<?XML version=”1.0” encoding=”UTF-8”?>
<xsl:stylesheet version=”1.0” xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:myspace=”d://XMLprogs/mynamespace”>

  在聲明了這個命名空間後,可以訪問該類的任何靜態方法,像這樣:

<xsl:variable name=”funvalue”select=”mynspace:classname.function()”/>

  如果方法不是靜態的,那麼必須首先調用類構造器,例如:

<xsl:variable name="funvalue" select="mynspace.classname.new()"/>
  <?XML version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="d://XMLprogs/mynamespace" exclude-result-prefixes="Java">


 

 Java包"mynamespace"必須位於"d://XMLprogs"目錄中。

  注意:使用可選屬性xsl:exclude-result-prefixes,預防了Java命名空間被包括到結果文檔中。

<xsl:template match="/">
<Html>
   <body>
     <p>
      <xsl:value-of select="Java:DateClass.displayDate()"/>
     </p>
   </body>
</Html>
</xsl:template>

  上面的XSLT代碼中,<xsl:value-of select="Java:DateClass.displayDate()"/>行調用位於mynamespace包中名為DateClass的類的靜態方法displayDate()。

  利用這種技術,你可以調用任何Java類方法——包括那些需要參數的方法——參數來自於你的XSLT模板。

  本文涉及的代碼:date.xsl

  <?XML version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:java="d://XMLprogs/mynamespace" exclude-result-prefixes="Java">
<xsl:template match="/">
<Html>
<body>
<p>
  <xsl:value-ofselect="Java:DateClass.displayDate()" />
</p>
</body>
</Html>
</xsl:template>
</xsl:stylesheet>

  DateClass.Java

packagemynamespace;
importJava.util.Date;
public class DateClass{
   public static String displayDate(){
      Date d = new Date();
      returnd.toString();
   }
}

  要運行這些代碼,需要:

  創建文件夾"d:XMLProgsmynamespace"。

  將DateClass.Java文件放入上述路徑並編譯得到DateClass.class文件。

  將"d:XMLProgsmynamespace"放入classpath變量中。

  利用XSLT處理器,例如XT或XALAN將該XSL文件和具體的XML文件關聯。



 

 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved