2010-06-03 12 views
6

Sto cercando di ottenere il contenuto di CDATA di un nodo XML utilizzando XSL. Il nodo attualmente appare così:Come ottenere CDATA dal nodo xml usando xsl?

<node id="1" text="Book Information" ><![CDATA[This is sample text]]></node> 

Ho bisogno il pezzo This is sample text. Qualcuno ha qualche idea su questo?

Grazie in anticipo.

+0

provato con il modello. Ma non sta restituendo alcun valore. –

+0

Quale modello? –

+0

In realtà, da varie risorse ho trovato qualcosa di simile; e quindi per recuperare CDATA; Non restituisce nulla. –

risposta

1

Alcuni altri semplici passaggi per raggiungere questo obiettivo;
Utilizzato l'editor W3cschools da provare.
Esempio di file XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<catalog> 
    <cd> 
     <disk id="title"><![CDATA[Sample xml]]></disk > 
     <disk id="artist"><![CDATA[Vijay]]></disk > 
    </cd> 
</catalog> 


Esempio file XSL:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Artist</th> 
     </tr> 
<xsl:for-each select="catalog/cd"> 

     <tr> 
     <td><xsl:value-of select="/catalog/cd/disk[@id='title']"/></td> 
     <td><xsl:value-of select="/catalog/cd/disk[@id='artist']"/></td> 
     </tr> 
</xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 


Il risultato finale è;
alt text

+0

prima di segnare qualsiasi cosa, vi chiedo tutti di fornire un motivo. In modo che sia utile per me. –

10

Beh, se uso questo foglio di stile:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="node/text()"> 
    <xsl:copy/> 
    </xsl:template> 
</xsl:stylesheet> 

su questo file XML:

<?xml version="1.0" encoding="utf-8"?> 
<node id=1 text="Book Information" ><![CDATA[This is sample text]]></node> 

ottengo un errore di analisi, perché è id=1 XML non valido.

Mettere le virgolette attorno al valore di attributo (id="1") ed eseguire nuovamente il foglio di stile, ottengo come output:

Questo è il testo del campione

Quindi c'è un inizio. Fondamentalmente, considera il CDATA come un nodo di testo e sei sulla buona strada.

Lei ha detto:

ho trovato qualcosa di simile:
<xsl:output cdata-section-elements="text"/>
e poi a prendere CDATA:
<xsl:value-of select="node" />

Questo approccio funziona bene se si sta utilizzando value-of anche. Qui sarebbe un esempio lungo le linee del tuo commento, usando invece value-of. Si noti, tuttavia, che cdata-section-elements funziona solo sul lato di uscita, ad indicare quale output di elementi XML si desidera stampare come sezioni CDATA invece di semplici dati di carattere vecchio. Non ha nulla a che fare con lo che preleva i dati da.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output cdata-section-elements="foo"/> 
    <xsl:template match="/"> 
    <foo> 
     <xsl:value-of select="node"/> 
    </foo> 
    </xsl:template> 
</xsl:stylesheet> 

stampe fuori

<?xml version="1.0"?> 
<foo><![CDATA[This is sample text]]></foo> 
+0

Ciao Owen, Bene, grazie per la risposta. In realtà, voglio CDATA sotto se condizione. Ci sono determinate condizioni che dipendono da loro, ho bisogno di assegnare questo valore CDATA ad un controllo Label. –

+1

Che ne dici di postare uno snippet di ciò che stai cercando di fare e dove vuoi che vada il tuo valore? –

-1

ho provato con varie combinazioni e ottenuto la soluzione per questo;

<xsl:value-of select="/node/."/> 
+0

prima di segnare qualsiasi cosa, vi chiedo tutti di fornire un motivo. In modo che sia utile per me. –

+2

Hai due risposte alla tua domanda. Questo è molto confuso, specialmente perché hai già accettato la tua risposta molto più lunga (e distraente). Sarei grato se combinassi entrambi in uno, rimuovendo i bit che non contribuiscono. – Alberto

0

per l'uscita sezioni CDATA:

Devi usare xsl:output/@cdata-section-elements. Da http://www.w3.org/TR/xslt#output

attributo cdata-section-elementi contiene un elenco separato da spazi di QNames. Ogni QName viene espanso in un nome esteso utilizzando le dichiarazioni dello spazio dei nomi in vigore su xsl: elemento di output in cui si verifica QName ; se esiste uno spazio dei nomi predefinito , viene utilizzato per QNames che non ha un prefisso. L'espansione è eseguita prima dell'unione di multiple xsl: elementi di output in un elemento xsl: output unico . Se il nome esteso del genitore di un nodo di testo è un membro dell'elenco, , il nodo di testo deve essere emesso come una sezione CDATA.

Oltre allo DOE, ovviamente.

Non è possibile selezionare sezioni CDATA con XPath. Secondo http://www.w3.org/TR/xpath/#data-model

Esistono sette tipi di nodo:

  • nodi principali

  • nodi elemento

  • nodi di testo

  • nodi attributo

  • nodi namespace

  • nodi di istruzioni di elaborazione

  • commento nodi

E da http://www.w3.org/TR/xpath/#section-Text-Nodes

Ogni personaggio all'interno di una sezione CDATA è trattato di un s dati di carattere.Pertanto, <![CDATA[<]]> nel documento di origine verrà trattato come <. Entrambi generano un singolo carattere < in un nodo di testo nell'albero. Così, un sezione CDATA è trattata come se il <![CDATA[ e ]]> sono stati rimossi e ogni occorrenza di < e & stati sostituiti rispettivamente da &lt; e &amp;.

0

L'unica soluzione che ho trovato sul web che funziona è questo -

{XSLT}  
<title> 
    <xsl:text disable-output-escaping="yes"><![CDATA[ <![CDATA[ ]]></xsl:text> 
    <xsl:value-of select="label" disable-output-escaping="yes"/> 
    <xsl:text disable-output-escaping="yes"><![CDATA[]]]]><![CDATA[>]]></xsl:text> 
</title> 

Tuttavia, questo non è il più pulito di soluzioni, soprattutto se è necessario implementare questo in varie parti del tuo XSLT. Inoltre, se il tuo input XML ha già il CDATA (cioè stai tentando di conservare CDATA) usando disable-output-escaping non funzionerà dato che a quel punto il CDATA è già stato analizzato dal motore XSLT e tutto ciò che rimane è il contenuto che può finire per rompere l'xml.

Ecco la mia soluzione -

A seconda di come si sta utilizzando XSLT, è possibile utilizzare le funzioni esterne/iniettati. Facendo ciò puoi facilmente ridurre la quantità di codice che stai scrivendo e finire con un modello molto più pulito:

{C#} 
public string CDATAWrap(string data) 
{ 
    return "<![CDATA[" + data + "]]>"; 
} 

{XSLT}  
<title> 
    <xsl:value-of select="CDataType:CDATAWrap(label)" disable-output-escaping="yes" /> 
</title>