2009-02-03 5 views
7

Ho un XSLT che ho creato per gestire un particolare documento xml. Tuttavia, ora alcuni spazi dei nomi vengono introdotti in alcuni, ma non in tutti i nostri documenti. Mi piacerebbe utilizzare lo stesso XSLT per questi documenti, tuttavia ho difficoltà a modificare il mio foglio di stile per essere indipendente dallo spazio dei nomi.Modifica di xslt per essere indipendente dallo spazio dei nomi

È stato suggerito in precedenza di modificare i miei percorsi x su *[local-name()="ElementName"], tuttavia, considerando che abbiamo già creato un foglio di stile, è molto laborioso.

Inoltre, sono consapevole di poter impostare lo xpath-default-namespace in uno spazio dei nomi specifico, ma come accennato in precedenza, non posso semplicemente impostarlo su #all o un elenco di possibili spazi dei nomi. Sto cercando una soluzione più efficace e ho a disposizione le funzioni di estensione del processore Saxon. Qualche idea? Grazie.

risposta

3

Avete considerato pre-elaborazione i tuoi documenti XML?

È possibile rimuovere tutti gli spazi dei nomi (prestare attenzione alle possibili interferenze) e quindi elaborarlo utilizzando la trasformazione XSL esistente.

Un simile approccio avrebbe il vantaggio che non è necessario modificare il proprio XSLT. Rimane leggibile (il * [local-name() = 'frob'] sembra così terribile) e mantenibile.

+0

Questo è quello che abbiamo finito per attenuare temporaneamente il problema dello spazio dei nomi. Sono d'accordo sul fatto che * [nome locale() non sia molto elegante. Grazie per l'aiuto! –

1

Dopo un'ulteriore consultazione, sembra che non ci sia semplicemente una via d'uscita. L'XSLT deve essere riprogettato per essere indipendente dallo spazio dei nomi oppure utilizzare l'attributo xpath-default-namespace sull'elemento <xsl:stylesheet>. Se vogliamo preservare lo spazio dei nomi del documento in entrata, ma hanno ancora un lavoro foglio di stile con più spazi dei nomi allora i nostri modelli dovrebbero somigliare il seguente modulo:

<xsl:template match="*[local-name(.)='ElementName']"> 
    <xsl:element name="{local-name(.)}" xmlns="http://yourURIhere"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template/> 

ecc

1

Forse non capisco il tuo problema, ma non potresti semplicemente avere il tuo modello (s) corrisponde sia la versione Namespace e la versione di namespace dell'elemento? - Ti piace questa:

<xsl:template match="ElementName | NS:ElementName" xmlns:NS="your-namespace"> 
    ... output ... 
</xsl:template> 

(In genere la dichiarazione del prefisso NS sarebbero immessi sul elemento stylesheet)

Questo è di gran lunga la versione più 'pulito' per me - ho beeen utilizzare questo avere un singolo foglio di stile XSLT per elaborare tutti e tre i formati RSS (0.91, 1.0 & 2.0).

+0

Questa è una buona soluzione, sebbene implichi ancora la riscrittura del modello complesso. Grazie per l'aiuto! –

+0

il problema si sta verificando con lo spazio dei nomi precedentemente in uso – akostadinov