2009-05-13 8 views
33

Mi piacerebbe prendere i dati da alcuni file XML e trasformarli in un nuovo documento XML. Tuttavia, non voglio che la definizione di uno spazio dei nomi nell'XSLT si verifichi nel documento dei risultati.XSL: evitare di esportare le definizioni dei namespace nei documenti XML risultanti

In altre parole:

fonte:

<Namespace:Root xmlns:Namespace="http://www.something.com"> 

foglio di stile:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:Namespace="http://www.something.com"> 

risultato:

<resultRoot xmlns:Namespace="http://www.something.com"> 
<!--I don't want the Namespace definition above--> 

Sto usando msxsl per la trasformazione.

risposta

60

È possibile utilizzare l'attributo exclude-result-prefixes dell'elemento xsl:stylesheet per sopprimere gli spazi dei nomi dal documento di output:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:Namespace="http://www.something.com" 
     exclude-result-prefixes="Namespace"> 

</xsl:stylesheet> 

Per sopprimere più spazi dei nomi dal documento di output, specificarli separati da spazi vuoti:

exclude-result-prefixes="ns1 ns2 ns3" 

Dal XSLT specification:

Quando un foglio di stile utilizza una dichiarazione dello spazio dei nomi solo per le finalità di affrontare l'albero dei sorgenti, specificando il prefisso nel escludono-risultato-prefissi attribuiscono eviterà dichiarazioni di namespace superflue l'albero dei risultati.

-4

uso di estensione-elemento prefissi = "Namespace"

come:

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:datetime="http://exslt.org/dates-and-times" 
xmlns:str="http://exslt.org/strings" 
xmlns:exsl="http://exslt.org/common" 
xmlns:uw="xalan://ru.sbtc.util.XSLUtil" 
extension-element-prefixes="exsl str datetime uw" 
version="1.0"> 
+0

Suppongo che tu intenda i prefissi exclude-result? –

+0

Utilizziamo prefissi di elementi di estensione e funziona perfettamente. I prefissi degli elementi di estensione – alamar

+2

hanno lo stesso effetto, ma hanno un effetto aggiuntivo. Qualsiasi elemento inserito in uno di questi spazi dei nomi verrà interpretato come un elemento di estensione (piuttosto che un elemento di risultato letterale). Potrebbe essere appropriato per gli esempi che hai nella tua risposta. Ma se non vuoi questo comportamento aggiuntivo, usa solo prefissi exclude-result –

9

La risposta di divo era già stata scelta, e in modo appropriato.

Ma se sei interessato a scavare più a fondo, controlla la sezione "Too many namespaces" nel mio opus magnum sull'argomento molto popolare di "Namespace in XSLT". (Sì, è stato fatto per essere ironico. :-))

+0

Ciao @Evan! Un link molto utile, infatti! Il trucco per non avere gli spazi dei nomi indesiderati durante l'utilizzo della copia è proprio quello che volevo. Ciò che mi ha sorpreso, però, è che questo trucco in realtà non funziona per XSLT 2.0 (ad esempio usando XALAN) ma devi seguire il percorso che hai tracciato per 2.0. In XSLT 1.0 (ad esempio usando 'xsltproc') funzionava bene. Quindi passare da un processore XSLT 1.0 a un XSLT 2.0 può effettivamente cambiare l'output in modo significativo anche se semanticamente gli spazi dei nomi aggiuntivi non dovrebbero essere un problema a valle tranne forse per gli aspetti del volume. –