2013-04-23 43 views
5

Tôi đang cố gắng tạo hàm XSLT tùy chỉnh, nhưng mỗi khi tôi nhận được lỗi này:Tạo hàm XSLT tùy chỉnh

'Đối số đầu tiên cho hàm Java không tĩnh' compareCI 'không phải là tham chiếu đối tượng hợp lệ. '

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:foo="http://whatever"> 

    <xsl:function name="foo:compareCI"> 
    <xsl:param name="string1"/> 
    <xsl:param name="string2"/> 
    <xsl:value-of select="compare(upper-case($string1),upper-case($string2))"/> 
    </xsl:function> 

    <xsl:template match="/"> 
     <xsl:value-of select="foo:compareCI('red','blue')"/> 
    </xsl:template> 

</xsl:stylesheet> 

Tôi hy vọng một người nào đó có thể giúp tôi. Cảm ơn rất nhiều trước.

+1

Nó hoạt động tốt khi tôi kết thúc bằng Oxy. Nó cho kết quả '1' khi so sánh 'màu đỏ' với 'màu xanh', và '0' khi so sánh 'màu đỏ' với 'không' –

+1

Làm thế nào để bạn chạy XSLT của bạn và với bộ xử lý nào? (Tôi đã sử dụng Saxon-HE 9.4.0.6 và nó hoạt động) – FiveO

+0

Tôi không biết phiên bản nào sử dụng Java. Mã Java của tôi là Nhà máy TransformerFactory = TransformerFactory.newInstance(); Nguồn xslt = new StreamSource (tệp mới ("/ home/xxx/xxx/aliformater-1.xslt")); Biến áp biến áp = factory.newTransformer (xslt); – javagc

Trả lời

6

Tôi nghĩ rằng bạn đang cố gắng chạy ứng dụng này bằng Xalan, bộ xử lý XSLT 1.0 và do đó không nhận ra hàm xsl:. Điều gì xảy ra là (a) Xalan bỏ qua hàm xsl:, vì bộ xử lý XSLT 1.0 được đưa ra một bảng định kiểu chỉ định phiên bản = "2.0" được cho là bỏ qua những thứ mà nó không hiểu (được gọi là "chế độ tương thích chuyển tiếp" trong spec); và sau đó khi nó nhìn thấy hàm gọi hàm foo: compareCI() nó cho rằng đây phải là một lời gọi đến một phương thức Java bên ngoài.

Bạn cần chạy bộ xử lý này bằng bộ xử lý XSLT 2.0, thường là Saxon.

+0

Làm tốt lắm.Cảm ơn rất nhiều – javagc

+0

Cảm ơn bạn. Chúng tôi đã đấu tranh với nó – Jack