2013-04-23 22 views
5

Próbuję utworzyć funkcję niestandardowych XSLT, ale za każdym razem otrzymuję ten błąd:Tworzenie własnych funkcji XSLT

„Pierwszym argumentem non-statycznej funkcji Java compareCI 'nie jest poprawnym odwołanie do obiektu. "

<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> 

Mam nadzieję, że ktoś z was może mi pomóc. Dzięki za dużo z góry.

+1

Działa dobrze na moim końcu w Oxygen. Daje wynik "1" porównując "czerwony" z "niebieskim" i "0" porównując "czerwony" z " –

+1

Jak uruchomić XSLT iz jakim procesorem? (Używałem Saxona-HE 9.4.0.6 i działa) – FiveO

+0

Nie wiem, która wersja korzystała z Javy. Mój kod Java to TransformerFactory factory = TransformerFactory.newInstance(); Źródło xslt = new StreamSource (nowy plik ("/ home/xxx/xxx/aliformater-1.xslt")); Transformator transformatorowy = factory.newTransformer (xslt); – javagc

Odpowiedz

6

Myślę, że próbujesz uruchomić to za pomocą Xalana, który jest procesorem XSLT 1.0 i dlatego nie rozpoznaje funkcji xsl :. Co się dzieje, że (a) Xalan ignoruje funkcję xsl:, ponieważ procesor XSLT 1.0, który ma arkusz stylów określający wersję = "2.0", powinien ignorować rzeczy, których nie rozumie (nazywany "trybem zgodności z przodu" w specyfikacji).); a potem, gdy widzi wywołanie funkcji foo: compareCI(), uważa, że ​​musi to być wywołanie zewnętrznej metody Javy.

Musisz uruchomić to z procesorem XSLT 2.0, zazwyczaj Saxonem.

+0

Dobra robota. Dziękuję bardzo za – javagc

+0

. Walczyliśmy o to – Jack