2009-10-01 14 views
7

Estoy tratando de convertir un documento con contenido como el siguiente en otro documento, dejando el CDATA exactamente como estaba en el primer documento, pero no he descubierto cómo para preservar el CDATA con XSLT.Transformar XML con XSLT y preservar CDATA (en Ruby)

XML inicial:

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

XML final:

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

He intentado algo como esto, pero no hubo suerte, todo se desordenadas:

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

alguna idea de cómo para preservar el CDATA?

Gracias! lanza

El uso de rubí/nokogiri

Actualización: Aquí hay algo que funciona.

<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> 

, que envolverá todo el texto() en los nodos CDATA, que trabaja para lo que necesito, y se preservará etiquetas HTML dentro del texto.

Respuesta

5

No se puede conservar la secuencia precisa de nodos CDATA si están mezclados con nodos de texto sin formato. A lo sumo, puede forzar todo el contenido de un elemento particular en el que la salida sea CDATA, haciendo una lista de ese nombre elemento de xsl:output/@cdata-section-elements:

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

¿Debo usar ruby ​​y tal vez expresiones regulares para preprocesarlas antes de hacer el xslt, o algo así? ¿De qué otra forma harías eso? Los elementos de sección de cdata no lo están cortando porque estoy usando variables y tal. Gracias por la sugerencia. –

+0

Si necesitas absolutamente CDATA, entonces tendrás que buscar algo que no sea XSLT. Dicho esto, tengo mucha curiosidad sobre la razón por la que lo necesitas. XDM no distingue entre texto y CDATA por una muy buena razón: ninguna aplicación de procesamiento de XML en su sano juicio debería darles una semántica diferente, por lo que CDATA y el escape de caracteres deberían ser intercambiables. –

+0

Estoy utilizando esta información en Flash, y he oído que hay muchos problemas con CDATA/sin CDATA. Todavía no lo he intentado realmente: p –

3

este momento para publicar una respuesta a mi propia pregunta, pero he encontrado algo que funciona :


<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> 

, que envolverá todo el texto() en los nodos CDATA, que trabaja para lo que necesito, y se preservará etiquetas hTML dentro del texto.

+0

Supongo que es una forma de obtener el nodo CDATA específicamente en la salida (excepto que puede obtener ']]>' en la entrada 'text()', en cuyo caso no lo hará hacer lo que esperas), pero no veo cómo esto te permitiría preservar los nodos CDATA que estaban allí en primer lugar, ya que todavía no tienes manera de distinguir los nodos de entrada de texto de los nodos de entrada CDATA. De lo contrario, no veo cómo esto es diferente de 'cdata-section-elements' ... –