Come eseguire XSLT 2.0 con ant?

Sto cercando di eseguire una trasformazione XSLT da un file ant .

Sto usando un foglio di stile XSLT 2.0 con un parser di saxon 9 (che supporta XSLT 2.0).

Il problema è che sembra che formichi sempre un parser XSLT 1.0.

Ecco il mio file ant:

  

Se lo chiamo direttamente (senza formica), funziona.

Qualche idea ?

Il problema è che mentre Saxon viene aggiunto al classpath, il meccanismo JAXP predefinito per determinare quale TransformsrFactory viene usato e utilizzerà il default che è Xalan. O hai bisogno di:

  • Impostare la variabile di sistema net.sf.saxon.TransformsrFactoryImpl su net.sf.saxon.TransformsrFactoryImpl ,
  • Aggiungi saxon9.jar alla CLASSPATH sistema CLASSPATH o
  • Usa all’interno dell’elemento xslt

Se si verifica questo problema, verificare che non si stia utilizzando Ant 1.8.1, poiché in Ant 1.8.1 c’è un bug che impedisce il corretto funzionamento. (Anche se questo non è il problema nel post originale, perché era antecedente alla pubblicazione di Ant 1.8.1).

Le tue opzioni sono:

  1. Usa una versione di Ant che non ha il bug (es. Ant 1.7.1).
  2. Specificare esplicitamente saxon9.jar in CLASSPATH in Ant prima che inizi, con:
    • Impostazione della CLASSPATH ambiente CLASSPATH del sistema o
    • Utilizzare l’opzione della riga di comando -lib per ant
  3. Definisci il tuo compito usando SAXON Ant (come descritto da un’altra risposta su questo thread).
  4. Soluzione alternativa aggiungendo processor="org.apache.tools.ant.taskdefs.optional.TraXLiaison" come attributo dell’elemento dell’attività xslt .

Suggerirei di utilizzare l’opzione 1, seguita dall’opzione 4.

L’opzione 2 funzionerà, ma pone la responsabilità sulla persona che esegue la formica per impostare il proprio ambiente ed eseguire correttamente la formica. Presumo che tu non lo voglia, ed è per questo che stai cercando di far funzionare l’attributo classpath sull’attività xslt .

L’opzione 3 presenta delle limitazioni, poiché SAXON Ant richiede il download e l’installazione del suo file JAR. Inoltre, SAXON Ant non funziona con SAXON 9.2 o successivo (e SAXON Ant non è stato aggiornato da quando è stato creato nel giugno 2008).

In teoria, specificare un sottoelemento di factory rende esplicito il processore XSLT – per impedire al caricatore di classi di trovare un processore XSLT diverso nella sua ricerca e usarlo al posto del processore XSLT che è più in basso nel CLASSPATH . In pratica (almeno nella form 1.7.0, 1.7.1 e 1.8.0) se viene specificato il sottoelemento di factory l’attività xslt ignora l’attributo classpath – il che significa che è necessario ricorrere alla specifica esplicita di CLASSPATH (opzione 2). Quindi non aiuta a risolvere il problema originale. Tuttavia, questo sembra essere stato risolto nel codice sorgente di Ant, quindi potrebbe funzionare nelle versioni successive alla 1.8.1.

Questo tutorial sembra dare istruzioni passo passo su come fare ciò che stai chiedendo:

http://www.abbeyworkshop.com/howto/xslt/ant-saxon/index.html

Da quello sembra che tu stia facendo la cosa giusta. Sei sicuro di aver bisogno delle doppie barre?

Aggiornamento: la documentazione di xslt Ant menziona la proprietà ‘factory’ che può aiutarti ad avvicinarti:

http://ant.apache.org/manual/Tasks/style.html

Anziché aspettare che questo venga risolto in 1.8.2 e quindi attendere che tutti eseguano l’upgrade alla versione 1.8.2, è ansible eseguire il rollover della propria macro XSLT (per le situazioni in cui si desidera utilizzare esplicitamente Saxon, anziché un motore XSLT selezionato dall’utente )

                  

puoi quindi invocarlo come (assumendo xmlns: mydep = “com.mycompany.mydepartment” è impostato sull’elemento del progetto)

      

Puoi trovare i documenti per il passaggio dei parametri a Saxon su http://www.saxonica.com/documentation/using-xsl/commandline.xml

EDIT: Dr. Michael Kay ha sottolineato che AntTransform non è più supportato, né raccomandato.

Creare un taskdef dalla class AntTransform di Saxon:

     


Ho iniziato a utilizzare l’attività standard con il jar saxon specificato in , ma ho riscontrato problemi di prestazioni. Sembrava “bloccarsi” per un po ‘quando veniva chiamato l’attività. Ho trovato che aggiungere processor="trax" e specificare aiuta a funzionare molto più velocemente.

      

Almeno in ant 1.8.0, l’attività xslt con un percorso di class specificato è molto lenta. Il problema sembra essere il caricamento del percorso di class. Ho eseguito la formica sotto JDB e ha speso tutto il tempo extra in org.apache.tools.ant.AntClassLoader.loadClass leggendo i file zip.

Ho provato questo prima di eseguire ant it è andato molto più veloce:

ant -lib /path/to/saxon/saxon9.jar

Il macrodef di Tom Howard funziona meglio e, sebbene abbia una syntax dispari per i parametri XSLT, almeno è ansible.