2012-10-06 85 views
4

我正在使用Saxon(如果需要,我可以使用Xalan)XSLT處理器進行一些轉換。 我想將以下對象的實例作爲參數傳遞給XSLT模板。在XSLT中調用Java實例方法

public class Test { 
    private String value; 

    public Test(String v) { 
     value = v; 
    } 
    //getters, setters etc. 
} 

所以我創建這個對象,即。

Test test = new Test("test"); 
transformer.setParameter("test", test); 

在XSLT文件我宣佈帕拉姆爲:

<xsl:param name="test" required="yes" as="jt:com.whatever.package.Test" xmlns:jt="http://saxon.sf.net/java-type"/> 

現在我的問題是我怎麼能叫內XSLT此對象的任何實例方法(即的getValue()。)?它甚至有可能嗎?我知道我可以調用不同Java類的靜態方法,但那不是我正在尋找的。

此外,是否有可能填充XSLT中的Java對象,即。調用一個對象實例的setter方法,然後在轉換完成後在Java代碼中使用這個對象和新值?

+0

你使用哪種版本撒克遜的是什麼呢? –

+0

我正在使用Saxon 9.謝謝 – Zyga

+0

「確切」在這裏至關重要。例如,Saxon-B 9.1的答案與Saxon-HE 9.4的答案不同。 –

回答

3

你應該能夠調用通過了「外部對象」的實例方法作爲你描述的參數。如果$ object是這樣一個對象,並且com.package.MyClass是它的類,並且您想調用此對象的getColor方法,那麼需要聲明一個名稱空間,如xmlns:MyClass = 「java的:com.package.MyClass」

(b)中調用方法MyClass的:的getColor($對象)

此機制用於調出到Java在撒克遜稱爲「自反擴展函數」。它在Saxon Home Edition中不受支持。您將需要撒克遜專業版或舊的開源Saxon-B產品。 Saxon中還有另一種稱爲「集成擴展函數」的機制,但它需要在Java方面多一點編碼來聲明參數和結果的類型。

您需要注意的是,使用自反擴展功能,撒克遜對如何將Java類型映射到XPath類型做出了最好的猜測,並且它並不總是以您想要的方式進行映射,特別是在使用集合類型。

儘量避免使用帶有副作用的方法,例如setter方法。沒有絕對可靠的方法可以確保Saxon以任何特定的順序執行此類調用,並且有時Saxon優化器會找到一種組織查詢的方式,避免進行調用。如果您必須進行此類調用,請將它們視爲調用正在返回結果(如空序列),並以如果返回結果的方式使用調用,結果將顯示在樣式表輸出中。

1

我很久以前用Xalan做了這個。首先,您需要將以下添加到您的XSLT(我不認爲你需要的一切,你把其他屬性)

<xsl:param name="test" /> 

,然後調用的方法,你可以做

<xsl:value-of select="test:getValue()"/> 
+0

它不與撒克遜工作(說未聲明的命名空間前綴{測試})。我會安裝Xalan並嘗試它。撒克遜人首選,因爲它支持xslt2。謝謝 – Zyga

+0

我試圖用Xalan做到這一點,但它表示'名稱空間前綴'測試'未聲明'。 – Grief

2

這是徹底這裏解釋說:

http://www.saxonica.com/html/documentation/extensibility/functions/

簡單例子

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:date="java:java.util.Date" exclude-result-prefixes="date"> 

<xsl:template match="/"> 
    <html> 
    <xsl:if test="function-available('date:to-string') and 
          function-available('date:new')"> 
     <p><xsl:value-of select="date:to-string(date:new())"/></p> 
    </xsl:if> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

當任何XML文檔(未使用)應用產生想要的,正確的結果:

<html> 
    <p>Sat Oct 06 11:41:30 PDT 2012</p> 
</html> 
+0

+1和OP的說明:您還可以將'extension-element-prefixes ='date''添加到'xsl:stylesheet'中,這樣您就不會得到'xmlns:date =「java:java.util。日期「在輸出中。 –

+1

雖然擴展元素前綴會產生這種效果,但這是該作業的錯誤工具:要使用的正確屬性是exclude-result-prefixes。 –

0

它太遲了我發佈,但對於其他人可能會有所幫助。

步驟1::

可以容易地與處理器的Xalan的幫助下實現此包括的Xalan依賴性或合適的罐涉案

<!-- https://mvnrepository.com/artifact/xalan/xalan --> 
<dependency> 
<groupId>xalan</groupId> 
<artifactId>xalan</artifactId> 
<version>2.7.1</version> 
</dependency> 

步驟2.選擇此處理器而用java

積分
TransformerFactory factory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null); 

第3步。在您的xsl中輸入樣式表中的信息

xmlns:uuid="xalan://PackageName.className" 

請注意,這個類必須具有您將使用在XSLT

步驟4的靜態方法:在XSLT使用它

<xsl:value-of select="uuid:methodName(string(xpath))" /> 

它可以是字符串或數字。 .depending在你的方法參數

來源:http://www.cafeconleche.org/books/xmljava/chapters/ch17s03.html

+0

問題是關於實例方法,而不是靜態方法 – Grief