2011-02-03 16 views
6

Ho un documento XML simile a:XSLT tag uscita html da XML

<tag> 
    <content>adsfasdf<b>asdf</b></content> 
</tag> 

vorrei per il XSLT per selezionare l'elemento di contenuto e mostrare tutto il contenuto:

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

Il XSLT è configurato per il rendering come HTML. C'è un modo in cui posso ottenere il valore di/copy-of per visualizzare il contenuto esatto senza dover renderlo?

Quello che sto cercando è

asdfasdf<b>asdf</b> 

E non:

asdfasdf asdf

+0

Buona domanda, +1. Sì, c'è un modo per farlo - vedi le risposte di @ Nick-Jones e me. :) –

risposta

10

Hai bisogno di fuggire i nomi dei tag all'interno del contenuto, io consiglierei qualcosa come:

<xsl:template match="content//*"> 
    <xsl:value-of select="concat('&lt;',name(),'&gt;')"/> 
    <xsl:apply-templates/> 
    <xsl:value-of select="concat('&lt;/',name(),'&gt;')"/> 
</xsl:template> 

che poi si potranno chiamare con:

<xsl:apply-templates select="/tag/content"/> 
+0

+1 per la risposta più appropriata. –

+0

+1 per una risposta corretta. – Flack

+0

+1 corretto: trasformazione di un nodo impostato in ** un nodo di testo **. Suggerimento: considera i casi per elementi vuoti, attributi e commenti (e PI se vuoi completarlo) –

1

modo rapido e sporco:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="content"> 
     <xsl:copy-of select="text() | *"/> 
    </xsl:template> 
</xsl:stylesheet> 

risultato contro il campione sarà be:

adsfasdf<b>asdf</b> 

Un altro approccio:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="b"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

+1 per il giusto suggerimento di usare 'copy-of' invece del' valore-di' che il poster ha nel suo codice.Ma penso che fare 'copia-di select = "node()" 'sia sufficiente per il modo rapido e sporco, non c'è bisogno di nominare testo e elemento figli separatamente con' text() | * '. –

+0

@Martin, prima ho scritto 'node()', ma poi ho riconsiderato :) – Flack

+0

Ho detto copia-di/valore-di – monksy

1

Vorrei lik e per l'XSLT per selezionare l'elemento di contenuto e mostrare tutto il contenuto :

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

Il XSLT è configurato per eseguire il rendering come HTML. C'è un modo per ottenere il valore di/copy-of per visualizzare il contenuto esatto senza dover eseguire il rendering di ?

Quello che sto cercando è

asdfasdf<b>asdf</b> 

E non:

asdfasdf asdf

La risposta di @ Nick-Jones si avvicina di più a ciò che si desidera.

fare avere uno sguardo al foglio di stile XSLT che fa parte del XPath Visualizer per una vasta esempio di come un display pieghevole in stile IE di qualsiasi documento XML può essere prodotta.