2011-08-22 19 views
6

Sto utilizzando XslCompiledTransform per convertire un file XML in HTML. C'è un modo per impedirgli di utilizzare i tag a chiusura automatica.Impedire a XslCompiledTransform di utilizzare tag a chiusura automatica

ad es.

<span></span> <!-- I want this even if content empty --> 
<span/> <!-- stop doing this! -> 

I tag a chiusura automatica in arco di sono rovinare il mio documento indipendentemente dal browser che uso, anche se è XML valido, è solo che 'arco', non è consentito di avere i tag a chiusura automatica.

Esiste un'impostazione che posso inserire nel mio xsl o nel mio codice C# .Net per impedire l'uso di tag a chiusura automatica?

+0

Un'estensione senza attributi o contenuto deve essere completamente invisibile. Avvolgere il tuo span in un xsl: se il blocco per verificare il contenuto funziona per te? –

+0

Il termine corretto è tag a chiusura automatica. –

+0

Buona domanda, +1. Vedi la mia risposta per due soluzioni alternative. –

risposta

0

Si può provare <xsl:output method="html"/>, tuttavia il risultato non sarebbe più un documento XML ben formato.

In alternativa, è possibile richiamare il metodo di XslCompiledTransform.Transform() passare come uno dei parametri vostro proprio XmlWriter. Nella tua implementazione hai il pieno controllo e puoi implementare qualsiasi serializzazione richiesta dell'albero dei risultati.

+1

Ciò genera ancora l' non valido, anche con metodo di output = "html". – Sheamus

+0

@Sheamus: Quindi devi assolutamente modificare le impostazioni per XmlWriter e/o scrivere la tua classe implementando XmlWriter, come raccomandato nella mia risposta .. –

0

Nel proprio XSLT, utilizzare <xsl:output method="html"/> e quindi assicurarsi che gli elementi del risultato HTML creati dal foglio di stile non siano nello spazio dei nomi. Inoltre, a seconda di come usi XslCompiledTransform nel tuo codice C#, devi assicurarti che le impostazioni di xsl:output nel foglio di stile siano onorate. Puoi facilmente ottenerlo trasformando in un file o stream o TextWriter, in tal caso non si deve fare nulla. Tuttavia, se per qualche motivo si trasforma in XmlWriter, è necessario assicurarsi che venga creato con le impostazioni corrette, ad es.

XslCompiledTransform proc = new XslCompiledTransform(); 
proc.Load("sheet.xsl"); 

using (XmlWriter xw = XmlWriter.Create("result.html", proc.OutputSettings)) 
{ 
    proc.Transform("input.xml", null, xw); 
} 

Ma di solito si dovrebbe andare bene, semplicemente trasformando ad un ruscello o TextWriter, in quel caso nulla nel codice C# deve essere fatto per onorare il metodo di uscita nel foglio di stile.

+2

è ancora generato. – Sheamus

0

L'unica soluzione che sono riuscito a trovare è aggiungere la logica al file XSL. Fondamentalmente se gli elementi che volevo racchiudere sono vuoti, non usare affatto l'elemento span.

<xsl:if test="count(jar/beans) > 0"> 
    <xsl:apply-templates select="jar/beans"/> 
</xsl:if> 

Non è l'ideale per avere a inserire questo ovunque nel mio file XSL, per compensare il fatto che, anche se ho scelto Metodo di uscita "html", è più che volentieri genererà HTML illegale.

Sigh.

1

Sebbene non sia stato possibile classificarlo come una soluzione diretta (poiché non emette un elemento vuoto), la soluzione che ho usato è stata quella di inserire uno spazio (usando xsl: text) nell'elemento - poiché questo è Markup HTML e se si attiva la modalità Standard (non strane), lo spazio extra non cambia il contenuto visualizzato. Inoltre, non avevo il controllo sull'invocazione dell'oggetto trasformato.

<div class="clearBoth"><xsl:text> </xsl:text></div> 
Problemi correlati