Search code examples
xmlxsltcdata

Convert an xml element whose content is inside CDATA


I have a xml fragment like below

<Detail uid="6">
    <![CDATA[
    <div class="heading">welcome to my page</div>
    <div class="paragraph">this is paraph</div>
    ]]>
</Detail>

and I want to be able to change the

<div class="heading">...</div> to <h1>Welcome to my page</h1>
<div class="paragraph">...</div> to <p>this is paragraph</p>

do you know how I can do that in xslt 1.0


Solution

  • What about running two transforms.

    Pass 1.)

    <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet
       version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    
      <xsl:template match="/">
        <xsl:apply-templates />
      </xsl:template>
    
        <xsl:template match="Detail">
            <Detail>
                <xsl:copy-of select="@*"/>
            <xsl:value-of select="." disable-output-escaping="yes" />
            </Detail>
        </xsl:template>
    
    </xsl:stylesheet>
    

    Will produce:

    <?xml version="1.0" encoding="UTF-8"?>
    <Detail uid="6"> 
        <div class="heading">welcome to my page</div>
        <div class="paragraph">this is paraph</div>
    </Detail>
    

    Pass 2.)

    <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet
       version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    
      <xsl:template match="/">
        <xsl:apply-templates />
      </xsl:template>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*| node()" />
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="div[@class='heading']">
            <h1><xsl:value-of select="."/></h1>
        </xsl:template>
    
        <xsl:template match="div[@class='paragraph']">
            <p><xsl:value-of select="."/></p>
        </xsl:template>
    
    </xsl:stylesheet>
    

    Produces:

    <?xml version="1.0" encoding="UTF-8"?>
    <Detail uid="6">
    <h1>welcome to my page</h1>
    <p>this is paraph</p>
    </Detail>