假如你希望將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文件關聯。