【问题标题】:Surround XML elements with CDATA section via XSLT通过 XSLT 用 CDATA 部分环绕 XML 元素
【发布时间】:2016-02-21 23:32:04
【问题描述】:

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


    【解决方案1】:

    鉴于此输入 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>
    

    【讨论】:

    • 像魅力一样工作!谢谢 kjhuges。
    • 可以分享您的知识:stackoverflow.com/questions/33810019/…
    • 我很高兴这有帮助。不客气。关于您的其他问题,Daniel Haley's answer 没有帮助吗?他和我都必须听取你的意见,说明这没有帮助。我建议您对他的回答发表评论。谢谢。
    • 请注意,此解决方案仅在 (a) 处理器支持禁用输出转义,并且 (b) 转换的输出直接馈送到序列化器时才有效。
    • @kjhughes:在 3.0 中,您可以先执行 &lt;xsl:output cdata-section-elements="param"/&gt;,然后执行 &lt;param&gt;{serialize(*)}&lt;/param&gt;,但是 (a) 这会将所有参数元素放入 CDATA 部分,并且 (b) 它仍然只有在转换器与串行器耦合——这确实是不可避免的,因为 XDM 数据模型中不存在 CDATA 部分。但真正的要求可能不是内容包含在 CDATA 中,而是输出包含一个词法 XML 字符串而不是元素标记,从这个意义上说,这个解决方案更加健壮。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2019-08-08
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2014-05-20
    相关资源
    最近更新 更多