2009-10-01 7 views
7

Sto provando a convertire un documento con contenuto simile al seguente in un altro documento, lasciando il CDATA esattamente come era nel primo documento, ma non ho capito come per conservare il CDATA con XSLT.Trasforma XML con XSLT e conserva CDATA (in Ruby)

XML iniziale:

<node> 
    <subNode> 
     <![CDATA[ HI THERE ]]> 
    </subNode> 
    <subNode> 
     <![CDATA[ SOME TEXT ]]> 
    </subNode> 
</node> 

XML finale:

<newDoc> 
    <data> 
     <text> 
      <![CDATA[ HI THERE ]]> 
     </text> 
     <text> 
      <![CDATA[ SOME TEXT ]]> 
     </text> 
    </data> 
</newDoc> 

Ho provato qualcosa di simile, ma senza fortuna, tutto diventa confuso:

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

Tutte le idee come conservare il CDATA?

Grazie! Lance

Utilizzando rubino/nokogiri

Aggiornamento: Ecco qualcosa che funziona.

<text disable-output-escaping="yes">&lt;![CDATA[</text> 
<value-of select="normalize-space(text())" disable-output-escaping="yes"/> 
<text disable-output-escaping="yes">]]&gt;</text> 

che vi avvolgerà tutto il testo() nodi CDATA, che lavora per quello che mi serve, e conserverà i tag HTML all'interno del testo.

risposta

5

Non è possibile conservare la sequenza precisa dei nodi CDATA se sono combinati con nodi di testo normale. Nella migliore delle ipotesi, è possibile forzare tutti i contenuti di un particolare elemento nell'output di essere CDATA, elencando quel nome elemento in xsl:output/@cdata-section-elements:

<xsl:output cdata-section-elements="text"/> 
+0

Devo usare solo il ruby ​​e forse le espressioni regolari per pre-elaborarli prima di eseguire xslt o qualcosa del genere? In quale altro modo lo faresti? Gli elementi della sezione cdata non lo stanno abbastanza tagliando perché sto usando variabili e così via. Grazie per il suggerimento. –

+0

Se hai assolutamente bisogno di CDATA, dovrai cercare qualcosa di diverso da XSLT. Detto questo, sono molto curioso del motivo per cui ne hai bisogno. XDM non distingue tra testo e CDATA per una buona ragione: nessuna applicazione di elaborazione XML sana dovrebbe mai fornire una semantica diversa, quindi CDATA e escape dei caratteri dovrebbero essere utilizzabili in modo intercambiabile. –

+0

Sto utilizzando questi dati in Flash e ho sentito che ci sono molti problemi con CDATA/no CDATA. Non ho ancora provato proprio questo: p –

3

Siamo spiacenti di inviare una risposta alla mia domanda, ma ho trovato qualcosa che funziona :


<text disable-output-escaping="yes">&lt;![CDATA[</text> <value-of select="normalize-space(text())" disable-output-escaping="yes"/> <text disable-output-escaping="yes">]]&gt;</text> 

che vi avvolgerà tutto il testo() nodi CDATA, che lavora per quello che mi serve, e conserverà i tag HTML all'interno del testo.

+0

Immagino che sia un modo per ottenere il nodo CDATA specificamente nell'output (eccetto che puoi ottenere ']]>' nell'input 'text()', nel qual caso non lo farà fare esattamente ciò che ci si aspetta), ma non vedo come questo ti consentirebbe di conservare i nodi CDATA che erano lì in primo luogo, dal momento che non hai ancora modo di distinguere i nodi di input dei nodi CDATA di input. Altrimenti, non vedo come questo sia diverso da 'cdata-section-elements' ... –