htmlxmlexcelxslt

How can I convert Excel XML to HTML using xslt?


I have xls-file in format Excel XML (http://www.microsoft.com/en-us/download/confirmation.aspx?id=101).

How can I convert to HTML using xslt or how to generate xslt-file to Excel?


Solution

  • XSLT

    <?xml version="1.0"?>
    
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
                    version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="/">
    <xsl:element name="style">
        <xsl:for-each select="ss:Workbook/ss:Styles/ss:Style">
        #<xsl:value-of select="@ss:ID"/>
        {
            <xsl:if test="ss:Alignment/@ss:Horizontal">
                text-align: <xsl:value-of select="ss:Alignment/@ss:Horizontal"/>;
            </xsl:if>
            <xsl:if test="ss:Alignment/@ss:Vertical">
                vertical-align: <xsl:value-of select="ss:Alignment/@ss:Vertical"/>;
            </xsl:if>
            <xsl:if test="ss:Alignment/@ss:Vertical">
                vertical-align: <xsl:value-of select="ss:Alignment/@ss:Vertical"/>;
            </xsl:if>
            <xsl:if test="ss:Font/@ss:Bold=1">
                font-weight: bold;
            </xsl:if>
            <xsl:if test="ss:Font/@ss:Color">
                color:<xsl:value-of select="ss:Font/@ss:Color"/>;
            </xsl:if>
            
            <xsl:if test="ss:Font/@ss:StrikeThrough=1">
                text-decoration:line-through
            </xsl:if>
            <xsl:if test="ss:Font/@ss:Underline='Single'">
                text-decoration:underline
            </xsl:if>
            <xsl:if test="ss:Interior/@ss:Color">
                background-color:<xsl:value-of select="ss:Interior/@ss:Color"/>;
            </xsl:if>
            <xsl:for-each select="ss:Borders/ss:Border">
                <xsl:if test="@ss:Color">
                    border-<xsl:value-of select="@ss:Position"/>-color:<xsl:value-of select="@ss:Color"/>;
                </xsl:if>
                <xsl:if test="@ss:Weight">
                    border-<xsl:value-of select="@ss:Position"/>-width:<xsl:value-of select="@ss:Weight"/>px;
                </xsl:if>
                <xsl:if test="@ss:LineStyle">
                    border-<xsl:value-of select="@ss:Position"/>-style:<xsl:value-of select="@ss:LineStyle"/>;
                </xsl:if>
            </xsl:for-each>
        }
        </xsl:for-each>
    </xsl:element>
        <xsl:element name="table">
            <xsl:for-each select="ss:Workbook/ss:Worksheet/ss:Table/ss:Row">
                <xsl:element name="tr">
                        
                    <xsl:for-each select="ss:Cell">
                        <xsl:element name="td">
                            <xsl:attribute name="id">
                                <xsl:value-of select="@ss:StyleID"/>
                            </xsl:attribute>
                            <xsl:if test="@ss:MergeAcross">
                                <xsl:attribute name="colspan">
                                    <xsl:value-of select="@ss:MergeAcross+1"/>
                                </xsl:attribute>
                            </xsl:if>
                            <xsl:value-of select="ss:Data"/>
                        </xsl:element>
                    </xsl:for-each>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
    </xsl:stylesheet>