通过XSLT将CDATA部分包含在XML元素中

时间:2015-11-19 17:22:33

标签: xml xslt cdata

我正在尝试添加<![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中。

1 个答案:

答案 0 :(得分:3)

鉴于此输入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会将param子元素包装在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>

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