Jak ustawić Saxona jako procesor Xslt w Javie?

To proste pytanie, ale nie mogę znaleźć odpowiedzi. Mam arkusz stylów XSLT 2.0, który próbuję przetworzyć w Javie. Opiera się na elementach XSL firmy Saxon.

Moja obecna klasa działa dobrze z prostym XSLT 1.0, ale dostaję błędy dotyczące nierozpoznanych elementów z moim 2.0 XSLT zbudowany z Saxon.

Nie wiem, jak powiedzieć Javie, żeby używała Saxona jako procesora. Używam javaxa.xml.transformacja w mojej klasie. Czy to jest nieruchomość, którą mogę ustawić? Co mam ustawić do? Dzięki!

Edytowane Wymyśliłem, jak ustawić nieruchomość na Saxona, ale teraz dostaję ten błąd.

Provider net.sf.saxon.TransformerFactoryImpl not found

Jak włączyć Saxon do mojej aplikacji?

Author: Dimitre Novatchev, 2012-07-03

3 answers

Istnieje wiele sposobów, aby to zrobić (w kolejności pierwszeństwa wyszukiwania):

Bezpośrednia Instancja

Explicite instantiate the Saxon factory (z ukłonem w stronę komentarza Michaela powyżej):

TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl()

takie podejście oznacza, że Twój kod jest zablokowany do używania Saxon w czasie kompilacji. Może to być postrzegane jako zaleta (brak ryzyka działania z niewłaściwym procesorem) lub wada (brak możliwości skonfigurowania innego procesora w czasie wykonywania - nie even Saxon Enterprise Edition).

Dla Saxon-PE, substytut com.saxonica.config.ProfessionalTransformerFactory. Dla Saxon-EE, substitute com.saxonica.config.EnterpriseTransformerFactory.

Podaj Nazwę Klasy

Określ klasę factory podczas jej konstruowania:

TransformerFactory fact = TransformerFactory.newInstance(
        "net.sf.saxon.TransformerFactoryImpl", null);

Uwaga: dostępne od wersji Java 6. Wersja Java 5 nie posiada tej metody.

takie podejście pozwala wybrać procesor w czasie wykonywania, jednocześnie unikając kosztów i ryzyka przeszukiwania ścieżki klasowej. Na przykład, twój aplikacja może zapewnić pewien mechanizm konfiguracji, aby umożliwić jej uruchamianie z różnymi wersjami Saxon poprzez wybór pomiędzy różnymi klasami Saxon factory.

Użyj Właściwości Systemu

Ustaw właściwość systemową javax.xml.transform.TransformerFactory przed utworzeniem instancji:

System.setProperty("javax.xml.transform.TransformerFactory",    
        "net.sf.saxon.TransformerFactoryImpl");

Lub w wierszu poleceń (Linia łamana dla czytelności):

java -Djavax.xml.transform.TransformerFactory=
        cnet.sf.saxon.TransformerFactoryImpl YourApp

takie podejście ma tę wadę, że właściwości systemu wpływają na całą maszynę Wirtualną Java. Ustawienie tej właściwości do wyboru Może oznacza to, że jakiś inny moduł w aplikacji, o którym możesz nawet nie wiedzieć, zaczyna używać Saxona zamiast Xalan, a ten moduł może się nie udać, jeśli użyje specyficznych dla Xalan konstrukcji XSLT.

Użyj Pliku Właściwości

Utwórz następujący plik:

JRE/lib/jaxp.properties

O następującej treści:

javax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl

takie podejście ma podobne konsekwencje do korzystania z właściwości systemowej.

Ładowarka Serwisowa

Utwórz następujące plik w dowolnym Jarze na CLASSPATH:

META-INF/services/javax.xml.transform.TransformerFactory

O następującej treści:

net.sf.saxon.TransformerFactoryImpl

takie podejście ma tę wadę, że mała zmiana ścieżki klasowej może spowodować uruchomienie aplikacji z innym silnikiem XSLT, być może takim, z którym aplikacja nigdy nie była testowana.

Default Platformy

Jeśli żadne z powyższych nie zostanie wykonane, wtedy zostanie załadowana domyślna instancja platformy TransformerFactory. Przyjazny opis tej warstwy plugability może znajdziesz tutaj .

Należy zauważyć, że "platforma" oznacza maszynę Wirtualną Java, a nie Sprzęt lub system operacyjny, na którym jest uruchomiona. Dla wszystkich obecnie znanych maszyn wirtualnych Java domyślną platformą jest wersja Xalan (która obsługuje tylko XSLT 1.0). Nie ma gwarancji, że będzie to zawsze dotyczyć każdej maszyny wirtualnej Java w przyszłości.

Uznałbym tę odpowiedź za argument przeciwko Javowemu sposobowi robienia rzeczy.

 67
Author: Wayne Burkett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 16:06:23

Możesz jawnie konstruować wymagane obiekty Source i Result, aby upewnić się, że są to implementacje Saxona, a nie te domyślne.

 0
Author: user268396,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 15:52:25

Napisałem wrapper wokół parsera Saxona, aby ułatwić jego użycie, i nazwałem go " EasySaxon ": możesz go znaleźć tutaj, z fragmentem kodu próbek.

Mam nadzieję, że to pomoże.

Francesco

 0
Author: Francesco Sblendorio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 10:27:29