通過XSLT訪問Java代碼[轉(zhuǎn)]
發(fā)表時(shí)間:2024-02-10 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]假如你希望將XML數(shù)據(jù)轉(zhuǎn)換為固定寬度和純文本的字符串——這剛好是XSLT不太方便實(shí)現(xiàn)的一個(gè)特性,或者,也許你希望在XML文件中執(zhí)行詞語(yǔ)替換。在這些情況下,當(dāng)你的事務(wù)超出了XSLT自身的處理能力時(shí),可以通過在你的XSLT處理器中調(diào)用Java函數(shù)來(lái)完成。我看到過利用類似VBScript和Jscript...
假如你希望將XML數(shù)據(jù)轉(zhuǎn)換為固定寬度和純文本的字符串——這剛好是XSLT不太方便實(shí)現(xiàn)的一個(gè)特性,或者,也許你希望在XML文件中執(zhí)行詞語(yǔ)替換。在這些情況下,當(dāng)你的事務(wù)超出了XSLT自身的處理能力時(shí),可以通過在你的XSLT處理器中調(diào)用Java函數(shù)來(lái)完成。
我看到過利用類似VBScript和Jscript的腳本語(yǔ)言完成特殊處理的例子(針對(duì)微軟解析器的),但是如何利用Java來(lái)執(zhí)行特殊的處理還不是特別地明顯。盡管如此,簡(jiǎn)單地說,可以在XSLT處理器中通過XML命名空間(namespaces)調(diào)用Java函數(shù)來(lái)實(shí)現(xiàn)。Java與XSLT的結(jié)合為構(gòu)建健壯的應(yīng)用程序提供了強(qiáng)有力的方法。
使用定制的命名空間\r
命名空間是通過使用統(tǒng)一資源標(biāo)識(shí)符(URI)來(lái)修飾限定XSL中元素和屬性名稱的一種方法。例如,常見的XSL元素需要有xsl命名空間前綴來(lái)修飾,xsl通過使用XSLT命名空間URI來(lái)聲明:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
但是并不局限于使用XSLT命名空間,你完全可以自由地聲明你自己定制的命名空間,并用它們來(lái)識(shí)別定制的XSLT標(biāo)簽和范圍。
你必須使用定制的命名空間前綴來(lái)完成對(duì)外部函數(shù)的調(diào)用,例如,mynspace:fundtion(),該命名空間前綴mynspace,必須與一個(gè)命名空間URI相關(guān)聯(lián),例如:
xmlns:myspace="d:///XMLprogs/mynamespace"
一般的Java綁定使用命名空間URI標(biāo)識(shí)Java類函數(shù)的位置。對(duì)用于本文示例代碼的Xalan XSLT處理器(版本1.2.2)來(lái)說,命名空間URI必須具有URI-stem/packagename的形式。如果你使用了XT,那么你的命名空間應(yīng)該有如下格式:
xmlns:mynspace="d://XMLprogs/mynamespace.myclassname
這種情況下,你可以使用XSLT代碼調(diào)用來(lái)自myclassname的Java函數(shù)。
綁定外部Java函數(shù)
此處給出在XSLT模板內(nèi)部綁定Java語(yǔ)言編寫的外部函數(shù)的過程。
將你自己定制的命名空間作為它們的屬性添加到樣式表(stylesheet)元素或者你的模板中。
確保你的Java類文件所在目錄位于你的XSLT處理器所運(yùn)行的Java虛擬機(jī)(JVM)的CLASSPATH中。
對(duì)于靜態(tài)方法,可以使可以用完全合格的類名稱加上方法和任何必需的的參數(shù),當(dāng)然還有命名空間前綴。
對(duì)于非靜態(tài)方法,首先創(chuàng)建類實(shí)例,然后調(diào)用該方法并提供任何必需的參數(shù)。
例如,下面的樣式表元素包含一個(gè)定制的命名空間聲明:
<?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”>
在聲明了這個(gè)命名空間后,可以訪問該類的任何靜態(tài)方法,像這樣:
<xsl:variable name=”funvalue”select=”mynspace:classname.function()”/>
如果方法不是靜態(tài)的,那么必須首先調(diào)用類構(gòu)造器,例如:
<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,預(yù)防了java命名空間被包括到結(jié)果文檔中。
<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()"/>行調(diào)用位于mynamespace包中名為DateClass的類的靜態(tài)方法displayDate()。
利用這種技術(shù),你可以調(diào)用任何Java類方法——包括那些需要參數(shù)的方法——參數(shù)來(lái)自于你的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.javapackagemynamespace;importjava.util.Date;public class DateClass{public static String displayDate(){Date d = new Date();returnd.toString();}}
要運(yùn)行這些代碼,需要:
創(chuàng)建文件夾"d:XMLProgsmynamespace"。
將DateClass.java文件放入上述路徑并編譯得到DateClass.class文件。
將"d:XMLProgsmynamespace"放入classpath變量中。
利用XSLT處理器,例如XT或XALAN將該XSL文件和具體的XML文件關(guān)聯(lián)。