2009-07-09 20 views
5

Sul mio sito Web ho XML con il mio contenuto della pagina (generato automaticamente dal mio DB) - che vengono visualizzati utilizzando XSLT. Il problema è questo: mi piacerebbe avere qualche formattazione all'interno di alcuni tag XML. Per esempio, se ho un XML che contiene un articolo in un formato come questo:XSLT: analisi HTML incorporato in XML?

<article> 
    <header>Cool article</header> 
    <author>Me!</author> 
    <content> 
    This is an article. It's <b>HUGE</b>, and here's a <a href="http://Www.foo.com">link</a>. 
    </content> 
</article> 

Tuttavia, se ho semplicemente ottenere il contenuto che utilizzano questo: <xsl:value-of select="content" /> tutta la formattazione HTML viene ignorato/persa. Immagino che sia scambiato per i nodi figlio XML, e non i dati reali che risiedono nel nodo del contenuto.

Qual è il modo migliore per ottenere la formattazione come descritto qui?

Grazie in anticipo.

+2

[QUESTO] (http://stackoverflow.com/questions/4707571/how-can-you-deal-with-embedded-xml-tags-in-xslt) è la risposta effettiva. Usa la 'copia-di' invece di' valore-di'. –

risposta

2

Credo che il problema è questo:

<xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
      media-type="application/html+xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/> 

assicurarsi che l'output è di tipo html,

application/html 
+0

Cheers! Setting method = "html" l'ha risolto bene. :) – Hallgeir

+0

Sono felice di poterti aiutare :). – Andrew

0

O codificare il codice html quando lo si incorpora chiaramente in un elemnet o utilizzare un blocco CDATA per conservare il testo effettivo. O dovrebbe funzionare anche se, a seconda di dove avviene la trasformazione (come il livello del browser tramite JS), l'output potrebbe essere diverso con le entità codificate.

+0

Ciao, sfortunatamente questo fa apparire i tag in testo semplice - cioè, non viene applicata alcuna formattazione. L'ho risolto usando . Grazie comunque – Hallgeir

7
<xsl:value-of select="content" /> 

emette il valore di un nodo. E il valore del nodo <content> in realtà è:

This is an article. It's HUGE, and here's a link

Quello che probabilmente bisogno è di copia l'intero nodo:

<xsl:copy-of select="content" /> 

Questo è in gran parte una supposizione dato che non so come la vostra sistema funziona.

+1

Cheers, questo era in parte il problema. :) Usando copy-of invece di value-of in combinazione con risolto. – Hallgeir

+1

Anche questo sembra corretto, ma dipende dall'avere XHTML incorporato nell'XML, non solo HTML. In secondo luogo, copy-of produrrà i contenuti nello spazio dei nomi del documento XML di origine originale, non lo spazio dei nomi in cui l'XSL è altrimenti in uscita. La maggior parte dei browser Web probabilmente non gli interesserà molto, ma se si vedono un sacco di attributi xmlns = "..." nel proprio output, questo è il motivo. –

+1

Vecchio post, mi ha aiutato ora. –

0

È possibile modificare la generazione di quel file XML per inserire il contenuto in una sezione <![CDATA[ ]]>, che indica al parser di ignorare il contenuto speciale all'interno di quella sezione.

+0

Salve, questo purtroppo fa apparire i tag in testo semplice - cioè, non viene applicata alcuna formattazione. L'ho risolto usando . Grazie comunque – Hallgeir

0

Quando inserisci l'HTML nel documento XML, assicurati che ogni codice HTML sia codificato prima di inserirlo nell'XML. Per esempio.

This is an article. It's <b>HUGE</b>, and here's a <a href="http://Www.foo.com">link</a>. 

diventerebbero:

This is an article. It's &lt;b&gt;HUGE&lt;/b&gt;, and here's a &lt;a href="http://www.foo.com"&gt;link&lt;/a&gt; 

o utilizzare un blocco CDATA in modo che la formattazione HTML non è persa.

+0

Ciao, sfortunatamente questo fa apparire i tag in testo semplice - cioè, non viene applicata alcuna formattazione. L'ho risolto usando . Grazie comunque – Hallgeir

3
<xsl:value-of 
select="..." 
disable-output-escaping="yes"/> 

Questo funziona su tutti i browser tranne Firefox.

+0

L'XSLT viene analizzato lato server, quindi a meno che manchi qualcosa il browser dovrebbe essere irrilevante? (Questa era la soluzione per il mio problema specifico, btw, quindi grazie!) –

+0

@NathanHornby I browser possono analizzare anche XML/XSLT. – ZippyV

+0

In che senso? . –