0
votes

First time I'm dealing with XSL Transforms and I need your help! Basically, I just want to reformat an XML with a stylesheet. Applying the identity transform works, except for some text elements that are already XML formatted within CDATA tags.

Original XML:

<Views>
    <View name="View 1">
        <parameter name="MultiPanedView" value="1" dt="3">
        </parameter>
        <parameter name="Layout" dt="4095"><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<xamDockManager version="9.2.20092.2186">
<contentPanes>
<contentPane name="Pane0eb6000a_b569_413b_92d6_07abd8fba376" location="Document" />
</contentPanes>
<panes />
<documents splitterOrientation="Vertical">
<splitPane name="viewsSplitPane" splitterOrientation="Vertical">
<tabGroup name="viewsTabGroupPane" selectedIndex="0">
<contentPane name="Pane0eb6000a_b569_413b_92d6_07abd8fba376" />
</tabGroup>
</splitPane>
</documents>
</xamDockManager>]]></parameter>
        <Pane1>
        </Pane1>
    </View>
</Views>

Result:

<Views>
      <View name="View 1">
            <parameter name="MultiPanedView" value="1" dt="3">
        </parameter>
            <parameter><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<xamDockManager version="9.2.20092.2186">
<contentPanes>
<contentPane name="Pane0eb6000a_b569_413b_92d6_07abd8fba376" location="Document" />
</contentPanes>
<panes />
<documents splitterOrientation="Vertical">
<splitPane name="viewsSplitPane" splitterOrientation="Vertical">
<tabGroup name="viewsTabGroupPane" selectedIndex="0">
<contentPane name="Pane0eb6000a_b569_413b_92d6_07abd8fba376" />
</tabGroup>
</splitPane>
</documents>
</xamDockManager>]]></parameter>
            <Pane1>
        </Pane1>
      </View>
</Views>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
  <!-- IDENTITY TRANSFORM -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- RETAIN XML MARKUP INSIDE CDATA -->
  <xsl:template match="parameter[@dt='4095']">
    <xsl:copy>
      <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
        <xsl:value-of select="." disable-output-escaping="yes"/>
      <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>  
    </xsl:copy>    
  </xsl:template> 
</xsl:stylesheet>

As you can see, the text appears correctly, but the parameter's attributes are lost!

Thanks in advance! Online XSL Transform available there: http://xsltransform.net/3Ngx5b4

1

1 Answers

0
votes

You're almost there. Just change the template like this

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0">
    <xsl:output indent="yes"/>
  <!-- IDENTITY TRANSFORM -->
  <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <!-- RETAIN XML MARKUP INSIDE CDATA -->
  <xsl:template match="parameter[@dt='4095']">
    <parameter name="Layout" dt="4095">
        <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
        <xsl:value-of select="." disable-output-escaping="yes"/>
        <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>  
    </parameter>    
  </xsl:template>
</xsl:stylesheet>