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

标签 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 中。

最佳答案

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

关于xml - 通过 XSLT 使用 CDATA 部分包围 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33810415/

相关文章:

javascript - 如何在 cdata 中正确使用方括号

c# - 使用 C# 提取和修改 xml 的 cdata 部分

通过 xslt 转换将 XML 文件转换为 output.xml

java - 我们如何从 xml 布局文件访问表面 View 类?

xml - powershell、xml 和命名空间

java - 使用 JMeter 加载测试结果 - 最小/最大时间给出 NaN

xslt - XSL : Include some ASCII control chars when method ="text"

java - JVM 使用哪个根目录来解析相对 URL?

xml - XML DTD 中的 PCDATA 与 CDATA

ruby-on-rails - Ruby on Rails - 如何呈现为具有 has_many 关联的 xml 模型