xsl-list
[Top] [All Lists]

[xsl] merging multiple xsl's - creates new node and ignores CDATA tags

2007-11-13 03:51:51
The problem I have is in merging multiple xsl files into a single file,
USING ANOTHER XSL file. Basically, we have dozens of xsl files with
<xsl:include>, to include common things that are kept in files like
header.xsl, footer.xsl etc. 

Example (trimmed minimal sample code) - Pls ignore any spell or
upper/lower case typo errors.

a) mainFile.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:include href="qmFooter.xsl"/>
    
        <xsl:template match="mResponse">                
                <xsl:if test="$doctype"><xsl:text
disable-output-escaping="yes">&lt;!DOCTYPE </xsl:text><xsl:value-of 

select="$doctype"/><xsl:text disable-output-escaping="yes">
&gt;</xsl:text></xsl:if>
                <html>
                        <head>.....             </head>
                        <body>
                                <!-- so many blah blah statements -->
                                <xsl:apply-templates/>
                                <xsl:call-template name="qmFooter"/>
                        </body>
                </html>
        </xsl:template>
</xsl:stylesheet>


b) qmFooter.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:template name="qmFooter">
                <div class="qm_FOOTNOTE"><xsl:value-of
select="./header/licenseText"/></div>
        </xsl:template>
</xsl:stylesheet>


Due to a speacial need we have had to make another SINGLE file merging
the <include>d files into main file. So, instead of merging physically,
made another xslt to do this process, using XMLSPY -> xslTransformation

c) Tranformation.xsl (actual code)

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 

xmlns:fo="http://www.w3.org/1999/XSL/Format";>
        <xsl:output method="xml" indent="yes"/>
        <xsl:template match="/">
                <xsl:apply-templates select="*"/>
        </xsl:template>
        <!-- the default copying process - match every node whether it
is an element or an attribute -->
        <xsl:template match="node()|@*">
                <xsl:choose>
                        <xsl:when test="name() = 'xsl:include'">
                                <xsl:variable name="includeFile"
select="@href"/>
                                <xsl:comment>
        
**********************************************************************
        Content of file <xsl:value-of select="$includeFile"/>
**********************************************************************
                                </xsl:comment>
                                <xsl:variable name="includeContent"
select="document($includeFile)"/>
                                <xsl:copy>
                                        <xsl:apply-templates
select="$includeContent/xsl:stylesheet/*"/>
                                </xsl:copy>
                        </xsl:when>
                        <xsl:otherwise>
                                <xsl:copy>
                                        <xsl:apply-templates
select="node()|@*"/>
                                </xsl:copy>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>
</xsl:stylesheet>

This do the merging, but adds an <xsl:include> node on the output as
shown below

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
        <!--
        
**********************************************************************
                Content of file qmFooter.xsl
**********************************************************************
        -->
        <xsl:include> 
        <!-- I NEED TO AVOID THIS xsl:include HERE. also, pls tell me: 
                1. WHY AND HOW THIS NODE GETS ADDED HERE 
                2. What change is required in Tranformation.xsl to
eliminate this.

         -->
                <xsl:template name="qmFooter">
                        <div class="qm_FOOTNOTE"><xsl:value-of
select="./header/licenseText"/></div>
                </xsl:template>
        </xsl:include>
        <xsl:template match="mResponse">
                <xsl:if test="$doctype">
                        <xsl:text
disable-output-escaping="yes">&lt;!DOCTYPE </xsl:text>
                        <xsl:value-of select="$doctype"/>
                        <xsl:text disable-output-escaping="yes">
&gt;</xsl:text>
                </xsl:if>
                <html>
                        <head>.....             </head>
                        <body>
                                <!-- so many blah blah statements -->
                                <xsl:apply-templates/>
                                <xsl:call-template name="qmFooter"/>
                        </body>
                </html>
        </xsl:template>
</xsl:stylesheet>


3) Also noticed, any opening and closing CDATA tag getting ignored
<![CDATA[But, this text come ok]]>. Example
  
<script type="text/javascript"><![CDATA[if ((document.forms[0] != null)
&& (document.forms[0].name == "END")) { SB_SetCanExit(true); }]]>
</script>

becomes

<script type="text/javascript">if ((document.forms[0] != null) &&
(document.forms[0].name == "END")) { SB_SetCanExit(true); }</script>

Is there a way to fix this?

4~) And let me know of any tother improvement or changes required in
Tranformation.xsl

Thanks in adv,
karl

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>