How to insert CDATA into XML text markup exported from Access 2003?

I have an XML export from Access 2003, and I tried to insert a CDATA tag in a text field (latin ...) with XSLT, but I am very poorly versed in XSLT ...

Here is the XML source:

<?xml version="1.0" encoding="UTF-8"?> <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd" generated="2012-07-31T13:25:46"> <export_x005F_xml_message> <libelle>h euismod tincidu </libelle> <price>300</price> <libelle2>h euirci tation ullamc</libelle2> </export_x005F_xml_message> <export_x005F_xml_message> <libelle>h euismod tincidunt ut lao</libelle> <price>200</price> <libelle2>h euirci tation ullamcorper</libelle2> </export_x005F_xml_message> </dataroot> 

Here is my start of XSLT ...:

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml"/> <xsl:template match='*[name() = "MESSAGES"]'> <xsl:text disable-output-escaping="yes"> &lt;![CDATA[ </xsl:text> <xsl:copy-of select="./node()"/> <xsl:text disable-output-escaping="yes"> ]]&gt; </xsl:text> </xsl:template> </xsl:stylesheet> 

I would like to get something like this:

  <?xml version="1.0" encoding="UTF-8"?> <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd" generated="2012-07-31T13:25:46"> <export_x005F_xml_message> <libelle><![CDATA[h euismod tincidu ]]></libelle> <price>300</price> <libelle2><![CDATA[h euirci tation ullamc ]]></libelle> </export_x005F_xml_message> <export_x005F_xml_message> <libelle><![CDATA[h euismod tincidunt ut lao ]]></libelle2> <price>200</price> <libelle2><![CDATA[h euirci tation ullamcorper ]]></libelle2> </export_x005F_xml_message> </dataroot> 

Can you help me create the right XSLT? This XML comes from Access 2003, which does not provide a CDATA option for the text field ... I am sure that a common model can help another developer like me :-)

+4
source share
3 answers

As already mentioned here: Converting XML using XSLT and saving CDATA (in Ruby) , the best answer is to use xsl: output. For instance...

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" cdata-section-elements="libelle libelle2" /> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 
+3
source

This is an identity transformation :

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes" cdata-section-elements="libelle libelle2"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 

when applied to the provided XML document (fixed because it is severely distorted):

 <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd" generated="2012-07-31T13:25:46"> <export_x005F_xml_message> <libelle>h euismod tincidu </libelle> <price>300</price> <libelle2>h euirci tation ullamc</libelle2> </export_x005F_xml_message> <export_x005F_xml_message> <libelle>h euismod tincidunt ut lao</libelle> <price>200</price> <libelle2>h euirci tation ullamcorper</libelle2> </export_x005F_xml_message> </dataroot> 

creates the desired, correct result :

 <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd" generated="2012-07-31T13:25:46"> <export_x005F_xml_message> <libelle><![CDATA[h euismod tincidu ]]></libelle> <price>300</price> <libelle2><![CDATA[h euirci tation ullamc]]></libelle2> </export_x005F_xml_message> <export_x005F_xml_message> <libelle><![CDATA[h euismod tincidunt ut lao]]></libelle> <price>200</price> <libelle2><![CDATA[h euirci tation ullamcorper]]></libelle2> </export_x005F_xml_message> </dataroot> 

Explanation

Proper use of the cdata-section-elements xsl:output attribute.

+2
source

Well, the only problem I see is the invocation of the xsl template.

It should look like this:

 <xsl:template name="MyTemplateName"> <someTag> <xsl:text disable-output-escaping="yes"> &lt;![CDATA[ </xsl:text> <someOtherTag/> <xsl:text disable-output-escaping="yes"> ]]&gt; </xsl:text> </someTag> </xsl:template> 

So your template will look like this:

 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd"> <xsl:template match="/"> <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2012-07-31T13:25:46"> <xsl:apply-templates select="export_x005F_xml_message"/> </dataroot> </xsl:template> <xsl:template match="export_x005F_xml_message"> <export_x005F_xml_message> <libelle> <xsl:text disable-output-escaping="yes"> &lt;![CDATA[ </xsl:text> <xsl:value-of select="libelle"/> </libelle> <xsl:text disable-output-escaping="yes"> ]]&gt; </xsl:text> ... </export_x005F_xml_message> </xsl:template> </xsl:stylesheet> 
+1
source

All Articles