2013-08-21 12 views
5

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

+2

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

+0

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

risposta

1

causa dei miei vincoli non sono in grado di controllare il codice o di eseguire i test, ma la tua situazione mi ricorda una situazione in cui ho avuto ho sostituito il seguente:

<xsl:variable name="x" as="element()"> 
    <stuff> 
    <more/> 
    </stuff> 
</xsl:variable> 
.... select="$x" ... 

con il seguente:

<xsl:variable name="x" as="element()"> 
    <wrapper xml:base="something"> 
    <stuff> 
     <more/> 
    </stuff> 
    </wrapper> 
</xsl:variable> 
.... select="$x/*" ... 

in questo modo <stuff> ha l'URI di base ma senza un xml: base = attributo, ma io sto selezionando <stuff> in entrambe le situazioni. Penso che il mio problema fosse che avevo bisogno di impostare l'URI di base, ma la DTD che convalidava il documento non forniva l'attributo ... o qualcosa del genere, dal momento che non sembra corretto come ho scritto io.

Spero che questo aiuti.

+0

Il '' 'something''' in xml: la base dovrebbe essere qualcosa di speciale?Ho provato: '' ' ' '' dichiarato nel contesto globale, ma che aveva ancora il suo contesto impostato sul foglio di stile originale invocando questo foglio di stile figlio, e non ai fogli di stile figlio, input XML. Guai! – Vadi

+0

No, niente di speciale. Speravo che l'URI di base si collegasse agli elementi figlio. Con più tempo oggi per capire la tua situazione, vedo davvero che il mio suggerimento non avrebbe aiutato. Sembra che tu stia perdendo l'URI di base lungo la strada da qualche parte. Perdonami per non poterti aiutare. –

+0

Nessun problema. Grazie. L'URI di base viene perso solo nel contesto globale: va bene in tutti i modelli. Tuttavia, a causa del modo in cui le variabili funzionano in XSLT, ho bisogno che le mie variabili selezionino i nodi per essere nel contesto globale. Pietà. – Vadi

Problemi correlati