通过 XSLT 使用 CDATA 部分包围 XML 元素

Surround XML elements with CDATA section via XSLT

我正在尝试添加一个 <![CDATA[]]> 来包装一组元素。

输入:

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

期望输出:

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

基本上当我有元素 param 的子元素时,我需要将子元素包装在 CDATA 中。

给定此输入 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>

此 XSLT 将在 CDATA 中包装 param 个子元素:

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

并生成此输出 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>