Quando i miei test vengono eseguiti con XSpec, c'è un problema lampante: l'URI di base delle variabili globali è impostato sul genitore xspec che esegue il mio XSLT e non l'input XML stesso.Come ottenere l'URI di base desiderato quando xsl viene eseguito da un altro file?
Così, quando la mia trasformazione XSL viene eseguita da sola contro l'XML, tutto va bene e le variabili globali selezionano ciò che dovrebbero: elementi nell'XML di input.
Tuttavia, quando viene eseguito tramite XSpec, l'URI di base è impostata XSpec stessa - presumibilmente perché le specifiche XSLT definisce base URI come:
Se un'istruzione elemento o elaborazione avviene in un'entità esterna, la l'URI di base di quell'elemento o istruzione di elaborazione è l'URI dell'entità esterna; in caso contrario, l'URI di base è l'URI di base del documento.
Quale è un problema per me. Ho provato a utilizzare l'attributo xml:base
su entrambe le variabili e allo xsl:stylesheet
: ma ciò non sembrava influenzare l'URI di base; riguardava solo fn:static-base-uri()
. Inoltre, static-base-uri()
restituisce sempre l'URI corretto che mi piacerebbe - quindi mi piacerebbe che quel valore diventasse in qualche modo l'URI di base per le mie variabili globali.
Una volta spostate le variabili in un modello e diventano locali, il loro URI di base va bene. Ma questo perderà l'intero punto di utilizzo delle variabili per me, e non è la duplicazione delle chiamate selezionate.
Qualche consiglio su come risolvere questo problema?
Sto utilizzando XSLT 2.0 con SAXON EE 9.4.0.6 (& HE edition).
Update 1
ho fatto un po 'di indagine, e sembra XSpec chiama sassone in questo modo:
java -cp "%CP%" net.sf.saxon.Transform -o:%RESULT% -s:%XSPEC% -xsl:%TEST_STYLESHEET% -it:{http://www.jenitennison.com/xslt/xspec}main
che significa che -s, la fonte File XML, è il foglio di stile .xspec stesso. Ha senso se deve fornire alcuni dati XML per una trasformazione al lavoro, ma in questo caso è la trasformazione sé che importa i dati XML funziona con via fn:doc()
- e purtroppo nel livello globale del mio xsl, la base uri è sbagliato e non impostato sul documento importato ma sul foglio di stile xspec.
Quindi, come test, ho impostato il flag Saxon -s sul documento di input XML e tada - l'URI di base ora è corretto. Ma questo significa che non posso usare nessun altro xml in xspec e quindi non è una soluzione molto praticabile.
Update 2
Dato un po 'di feedback da Michael Kay (grazie!), Ho attaccato il minimal test case con cui sto lavorando. Dovrai anche scaricare XSpec 0.4-rc1, ma non è necessario.
Una volta che hai XSpec, se sei su Windows, xspec-0.4.0rc1/bin/xspec.bat deve essere modificato per puntare il vaso di Saxon sulla linea 3.
Altrimenti, per eseguirlo, si fa xspec.bat .\DCM2EA.xspec
.
L'URI di base globale nell'output, idealmente, punta a NEHTA-00009-Adverse_Reaction-Structure (sample data).xml
. Al momento, non lo fa - punta a .xspec. Questo è direttamente influenzato da -s:%XSPEC%
in xspec.bat nella riga 73.
Il modo in cui xspec funziona è che crea una trasformazione intermedia data a DCM2EA.xspec e ai suoi test in xspec/DCM2EA.xsl e esegue quella trasformazione (ecco perché XSpec in questo caso è facoltativo, è possibile eseguire xspec - nome attributo errato/xspec/DCM2EA.xsl direttamente).
Il problema che sto riscontrando è che base-uri()
all'interno del contesto globale nel DCM2EA.xsl originale è impostato sul file xspec, che è errato. Il base-uri()
all'interno di un modello è impostato correttamente (come si vede da Base URI now
nell'output), ma non è pratico spostare le variabili nello scope locale.
Specificare i dati xml di input non è possibile perché il mio file .xspec effettivo importa diversi file e non voglio suddividere i 190 test che ho ottenuto e aggiungere tali soluzioni.
Speravo che l'xml:base
potesse essere d'aiuto, ma non l'ho fatto funzionare e sono fuori dalle soluzioni.
Grazie per la ricerca!
L'analisi della situazione è vicina, ma non accurata al 100%. Quando il valore di una variabile globale è un documento temporaneo, l'URI di base di quel documento è sempre l'URI di base del foglio di stile: ovvero, lo stesso di static-base-uri(). Penso che abbiamo bisogno di vedere del codice, in particolare, quando dici "l'URI di base" è impostato su XSpec stesso, dobbiamo vedere quale URI di base stai parlando e come lo stai usando. –
In questo caso il documento temporaneo è un .xsl effettivo che viene generato e quindi eseguito come una trasformazione (il processo gestito da uno script di shell). Non era chiaro lì, mi scuso. Ho allegato il test case ora e ho spiegato come sto lavorando, grazie per aver risposto! – Vadi