<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:str="http://exslt.org/strings" extension-element-prefixes="str" > <xsl:output method="xml" omit-xml-declaration="yes"/> <xsl:template name="rbga-to-hex"> <xsl:param name="rgba-val"/> <xsl:param name="count" select="1"/> <xsl:variable name="val" select="substring-before($rgba-val,',')"/> <xsl:variable name="tail" select="substring-after($rgba-val,concat($val,','))"/> <xsl:choose> <xsl:when test="$count < 3"> <xsl:call-template name="to-hex"> <xsl:with-param name="val" select="$val"/> </xsl:call-template> <xsl:call-template name="rbga-to-hex"> <xsl:with-param name="count" select="$count + 1"/> <xsl:with-param name="rgba-val" select="$tail"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="to-hex"> <xsl:with-param name="val" select="$rgba-val"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="to-hex"> <xsl:param name="val"/> <xsl:param name="max" select="255"/> <xsl:param name="min" select="0"/> <xsl:param name="hex-key" select="'0123456789ABCDEF'"/> <!-- REMOVE NON-NUMERIC CHARACTERS --> <xsl:variable name="val" select="translate($val,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-_=+!@#$%^*():; ','')"/> <!-- insure that the rgb value is within 0-255 --> <xsl:variable name="num"> <xsl:choose> <xsl:when test="$val > $max"> <xsl:value-of select="$max"/> </xsl:when> <xsl:when test="$val < $min"> <xsl:value-of select="$min"/> </xsl:when> <!-- insure that we have whole numbers --> <xsl:otherwise> <xsl:value-of select="round($val)"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- Return Hex Val --> <!-- substring(string, position, length) --> <xsl:value-of select="concat( substring($hex-key,(ceiling(($num - ceiling($num mod 16)) div 16)+1),1), substring($hex-key,($num mod 16)+1,1) )"/> </xsl:template> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-- Try to do replacements completely in XSLT --> <!-- w:p doesn't work right now <xsl:template match="w:p[descendant::ul|descendant::ol]"> <xsl:for-each select="node()|@*"> <xsl:choose> <xsl:when test="descendant::ul|descendant::ol" > <xsl:variable name="current" select="." /> <xsl:variable name="break" select="descendant::*[ul|ol|table]" /> Breakers <xsl:copy-of select="$break" /> </xsl:template> --> <xsl:template name="apply-styles" match="w:r[descendant::strong|descendant::b|descendant::i|descendant::em|descendant::u|descendant::span]"> <xsl:for-each select="node()|@*[not(w:rPr)]"> <xsl:choose> <xsl:when test="descendant::strong|descendant::b|descendant::i|descendant::em|descendant::u|descendant::span" > <xsl:for-each select="node()|@*"> <xsl:choose> <xsl:when test="descendant-or-self::strong|descendant-or-self::b|descendant-or-self::i|descendant-or-self::em|descendant-or-self::u|descendant-or-self::span" > <w:r> <w:rPr> <xsl:apply-templates select=".|child::*" /> </w:rPr> <w:t xml:space="preserve"><xsl:value-of select="." /></w:t> </w:r> </xsl:when> <xsl:otherwise> <w:r><w:t xml:space="preserve"><xsl:copy-of select="." /></w:t></w:r> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:when> <xsl:otherwise> <w:r> <xsl:copy-of select="." /> </w:r> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> <!-- Fix any bad breaks --> <xsl:template match="w:t[child::w:br]"> <w:t> <xsl:copy-of select="text()"/> </w:t> <w:br/> </xsl:template> <xsl:template match="i|em"> <w:i /> </xsl:template> <xsl:template match="b|strong"> <w:b /> </xsl:template> <xsl:template match="u"> <w:u w:val="single" /> </xsl:template> <!-- Color & font --> <xsl:template match="span"> <xsl:variable name="style" select="str:tokenize(@style,';')" /> <xsl:for-each select="$style"> <xsl:if test="starts-with(.,'color:')"> <xsl:variable name="hex"> <xsl:choose> <xsl:when test="contains(., 'rgb(')"> <xsl:call-template name="rbga-to-hex"> <xsl:with-param name="rgba-val" select="substring-after(.,':')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring-after(.,'#')" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <w:color w:val="{$hex}" /> </xsl:if> <xsl:if test="starts-with(.,'background-color:')"> <xsl:variable name="hex"> <xsl:choose> <xsl:when test="contains(., 'rgb(')"> <xsl:call-template name="rbga-to-hex"> <xsl:with-param name="rgba-val" select="substring-after(.,':')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring-after(.,'#')" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <w:shd w:fill="{$hex}"/> </xsl:if> <xsl:if test="starts-with(.,'font-size')"> <xsl:variable name="font-size" select="substring-after(text(),'font-size:')" /> <!-- Approximate conversion that seems to work --> <xsl:variable name="size" select="ceiling(number(translate($font-size,translate($font-size,'0123456789',''),''))*2)"/> <w:sz w:val="{$size}"/> <w:szCs w:val="{$size}"/> </xsl:if> <xsl:if test="starts-with(., 'font-family:')"> <xsl:variable name="font-name" select="translate(substring-before(substring-after(.,'font-family:'),','),"'",'')" /> <w:rFonts w:ascii="{$font-name}" w:hAnsi="{$font-name}"/> </xsl:if> </xsl:for-each> <xsl:apply-templates select="./span"/> </xsl:template> <!-- Unordered (bullet) & ordered (number) list Faked using text. --> <xsl:template match="ul[child::li]|ol[child::li]"> <xsl:for-each select="./li"> <w:p> <w:pPr> <w:tabs> <w:tab w:leader="none" w:pos="707" w:val="left"/> </w:tabs> <w:ind w:hanging="283" w:left="707" w:right="0"/> <w:spacing w:after="0" w:before="0"/> </w:pPr> <w:r> <xsl:choose> <xsl:when test="name(..)='ol'"> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> <w:t><xsl:number value="position()" format="1" />.</w:t><w:tab /> </xsl:when> <xsl:otherwise> <w:rPr> <w:rFonts w:ascii="Symbol" w:cs="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> <w:t>·</w:t><w:tab/> </xsl:otherwise> </xsl:choose> </w:r> <xsl:choose> <xsl:when test="count(child::*)=0"> <xsl:variable name="text"> <xsl:choose> <xsl:when test="starts-with(text(), ' ')"> <xsl:value-of select="substring-after(text(),' ')"/> </xsl:when> <xsl:when test="starts-with(text(),' ')"> <xsl:value-of select="substring-after(text(),' ')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="text()"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <w:r><w:t> <xsl:value-of select="normalize-space($text)"/> </w:t></w:r> </xsl:when> <xsl:otherwise> <!-- Strip out styles, they would need to be processed--> <w:r><w:t> <xsl:value-of select = "normalize-space(child::*)"/> </w:t></w:r> </xsl:otherwise> </xsl:choose> </w:p> </xsl:for-each> </xsl:template> <!-- HTML Table --> <xsl:template match="table"> <w:tbl> <w:tblPr> <w:tblW w:type="pct" w:w="4500"/> <w:jc w:value="left"/> <xsl:if test="@border > 0"> <w:tblBorders> <xsl:variable name="width" select="number(@border)*2"/> <w:top w:color="000000" w:space="0" w:sz="{$width}" w:val="single"/> <w:left w:color="000000" w:space="0" w:sz="{$width}" w:val="single"/> <w:bottom w:color="000000" w:space="0" w:sz="{$width}" w:val="single"/> <w:right w:color="000000" w:space="0" w:sz="{$width}" w:val="single"/> </w:tblBorders> </xsl:if> </w:tblPr> <w:tblGrid> <xsl:for-each select="./tr[1]/td"> <w:gridCol /> </xsl:for-each> </w:tblGrid> <xsl:for-each select="./tr"> <w:tr> <xsl:for-each select="./td"> <w:tc> <xsl:if test="../../@border > 0"> <w:tcPr><w:tcBorders> <xsl:variable name="width" select="number(../../@border)*2"/> <w:top w:color="000000" w:space="0" w:sz="{$width}" w:val="single"/> <w:left w:color="000000" w:space="0" w:sz="{$width}" w:val="single"/> <w:bottom w:color="000000" w:space="0" w:sz="{$width}" w:val="single"/> <w:right w:color="000000" w:space="0" w:sz="{$width}" w:val="single"/> </w:tcBorders></w:tcPr> </xsl:if> <w:p> <xsl:call-template name="apply-styles"> <w:r> <xsl:copy-of select="node()|@*"/> </w:r> </xsl:call-template> </w:p> </w:tc> </xsl:for-each> </w:tr> </xsl:for-each> </w:tbl> </xsl:template> </xsl:stylesheet>