How do I force xslt transformation to load data into cdata sections?

后端 未结 2 729
心在旅途
心在旅途 2021-01-20 10:54

I have a client who requires all text in the xml I supply them with to be in CDATA sections. I understand that text should not need to be in CDATA as it has already been par

相关标签:
2条回答
  • 2021-01-20 11:34

    Well as your question title talks about XSLT and your question is flagged as XSLT, the XSLT way to ensure a result element's content is serialized as a CDATA section is to use the cdata-section-elements attribute on the xsl:output element (http://www.w3.org/TR/xslt20/#serialization) listing all elements you want to output as CDATA sections. Thus if you know the elements you want to output as CDATA sections when writing the stylesheet it is a simple as listing them in that attribute. Does that help? Or do you want to postprocess arbitrary XML with XSLT to add CDATA sections?

    0 讨论(0)
  • 2021-01-20 11:40

    Here is a complete example:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"
     cdata-section-elements="num"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
     </xsl:template>
    </xsl:stylesheet>
    

    when this transformation is applied on the following sample XML document:

    <nums>
      <num>01</num>
      <num>02</num>
      <num>03</num>
      <num>04</num>
      <num>05</num>
      <num>06</num>
      <num>07</num>
      <num>08</num>
      <num>09</num>
      <num>10</num>
    </nums>
    

    the result has all text nodes (all of them are children of num elements) represented within CDATA sections:

    <nums>
       <num><![CDATA[01]]></num>
       <num><![CDATA[02]]></num>
       <num><![CDATA[03]]></num>
       <num><![CDATA[04]]></num>
       <num><![CDATA[05]]></num>
       <num><![CDATA[06]]></num>
       <num><![CDATA[07]]></num>
       <num><![CDATA[08]]></num>
       <num><![CDATA[09]]></num>
       <num><![CDATA[10]]></num>
    </nums>
    

    Explanation:

    1. Using the identity rule to output every node as is.

    2. Using the cdata-section-elements attribute of xsl:output to specify the space-separated list of elements, whose text-node children must be serialized as CDATA sections.

    Do note: In your case it would be convenient not to modify your existing transformations at all, but to have a post-processing step on their results that is similar to this example.

    0 讨论(0)
提交回复
热议问题