Sammy
Sammy

Reputation: 121

Surround XML elements with CDATA section via XSLT

I am trying to add a <![CDATA[]]> to wrap a group of elements.

Input:

<?xml version="1.0" encoding="UTF-8"?>
<params>
  <param dataType="java.lang.String">respID</param>
  <param dataType="java.lang.Date">2015-11-04</param>
  <param dataType="java.lang.String">

     <XX_IL_OLM_COMP_ELEMENT_OBJ><P_OLM_COMP_ELEMENT>
<XX_IL_OLM_COMP_ELEMENT_OBJ>
    <P_ACTION>CREATE</P_ACTION>
    <p_activity_version_id>12</p_activity_version_id>
</XX_IL_OLM_COMP_ELEMENT_OBJ>
</P_OLM_COMP_ELEMENT>
</XX_IL_OLM_COMP_ELEMENT_OBJ>

  </param>
</params>

Desired output:

<?xml version="1.0" encoding="UTF-8"?>
<params>
  <param dataType="java.lang.String">respID</param>
  <param dataType="java.lang.Date">2015-11-04</param>
  <param dataType="java.lang.String">
<![CDATA[
     <XX_IL_OLM_COMP_ELEMENT_OBJ><P_OLM_COMP_ELEMENT>
<XX_IL_OLM_COMP_ELEMENT_OBJ>
    <P_ACTION>CREATE</P_ACTION>
    <p_activity_version_id>12</p_activity_version_id>
</XX_IL_OLM_COMP_ELEMENT_OBJ>
</P_OLM_COMP_ELEMENT>
</XX_IL_OLM_COMP_ELEMENT_OBJ>
]]>
  </param>
</params>

Basically when I have child elements for element param, I need to wrap the child elements inside CDATA.

Upvotes: 4

Views: 4094

Answers (1)

kjhughes
kjhughes

Reputation: 111726

Given this input XML:

<?xml version="1.0" encoding="UTF-8"?>
<params>
  <param dataType="java.lang.String">respID</param>
  <param dataType="java.lang.Date">2015-11-04</param>
  <param dataType="java.lang.String">

    <XX_IL_OLM_COMP_ELEMENT_OBJ><P_OLM_COMP_ELEMENT>
      <XX_IL_OLM_COMP_ELEMENT_OBJ>
        <P_ACTION>CREATE</P_ACTION>
        <p_activity_version_id>12</p_activity_version_id>
      </XX_IL_OLM_COMP_ELEMENT_OBJ>
    </P_OLM_COMP_ELEMENT>
    </XX_IL_OLM_COMP_ELEMENT_OBJ>

  </param>
</params>

This XSLT will wrap param child elements in CDATA:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This XSLT will wrap `param` element contents in CDATA:-->
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="param[*]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>

      <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
      <xsl:copy-of select="*"/>    
      <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
    </xsl:copy>
  </xsl:template>
</xsl:transform>

And produce this output XML:

<?xml version="1.0" encoding="UTF-8"?>
<params>
  <param dataType="java.lang.String">respID</param>
  <param dataType="java.lang.Date">2015-11-04</param>
  <param dataType="java.lang.String"><![CDATA[<XX_IL_OLM_COMP_ELEMENT_OBJ>
         <P_OLM_COMP_ELEMENT>
            <XX_IL_OLM_COMP_ELEMENT_OBJ>
               <P_ACTION>CREATE</P_ACTION>
               <p_activity_version_id>12</p_activity_version_id>
            </XX_IL_OLM_COMP_ELEMENT_OBJ>
         </P_OLM_COMP_ELEMENT>
      </XX_IL_OLM_COMP_ELEMENT_OBJ>]]></param>
</params>

Upvotes: 5

Related Questions