414 lines
19 KiB
Java
414 lines
19 KiB
Java
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!--***********************************************************
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
***********************************************************-->
|
|
|
|
|
|
<xsl:stylesheet version="1.0"
|
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
|
|
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
|
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
xmlns:dom="http://www.w3.org/2001/xml-events"
|
|
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
|
|
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
|
|
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
|
|
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
|
|
xmlns:math="http://www.w3.org/1998/Math/MathML"
|
|
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
|
|
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
|
|
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
|
|
xmlns:ooo="http://openoffice.org/2004/office"
|
|
xmlns:oooc="http://openoffice.org/2004/calc"
|
|
xmlns:ooow="http://openoffice.org/2004/writer"
|
|
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
|
|
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
|
|
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
|
|
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
|
|
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
exclude-result-prefixes="chart config dc dom dr3d draw fo form math meta number office ooo oooc ooow script style svg table text xlink">
|
|
|
|
|
|
<!--+++++ INCLUDED XSL MODULES +++++-->
|
|
|
|
<!-- helper collection, to convert measures (e.g. inch to pixel using DPI (dots per inch) parameter)-->
|
|
<xsl:import href="../../common/measure_conversion.xsl" />
|
|
|
|
<!-- excel table handling -->
|
|
<xsl:include href="table.xsl" />
|
|
|
|
<!-- mapping rules of office style properties to Excel style properties -->
|
|
<xsl:include href="style_mapping.xsl" />
|
|
|
|
<!-- creating the Excel styles element -->
|
|
<xsl:include href="styles.xsl" />
|
|
|
|
<!-- mapping formalar Expressions -->
|
|
<xsl:include href="formular.xsl" />
|
|
|
|
<xsl:output method = "xml"
|
|
indent = "no"
|
|
encoding = "UTF-8"
|
|
omit-xml-declaration = "no" />
|
|
|
|
<xsl:strip-space elements="ss:Data html:Data" />
|
|
|
|
|
|
<!-- common table handling -->
|
|
<xsl:variable name="namespace" select="'urn:schemas-microsoft-com:office:spreadsheet'" />
|
|
|
|
<!--+++++ PARAMETER SECTION +++++-->
|
|
|
|
<!-- OPTIONAL: (MANDATORY: for all input document with relative external links): parameter is a (relative) URL to the target directory.
|
|
Relative links from the office document (e.g. to external graphics) will get this parameter as a prefix -->
|
|
<xsl:param name="targetBaseURL" select="'./'" />
|
|
|
|
<!-- OPTIONAL: (MANDATORY: for input document with relative internal links)
|
|
To access contents of a office file (content like the meta.xml, styles.xml file or graphics) a URL could be choosen.
|
|
This could be even a JAR URL. The sourceBase of the content URL "jar:file:/C:/temp/Test.sxw!/content.xml" would be
|
|
"jar:file:/C:/temp/Test.sxw!/" for example.
|
|
When working with OpenOffice API a Package-URL encoded over HTTP can be used to access the jared contents of the the jared document. -->
|
|
<xsl:param name="sourceBaseURL" select="'./'" />
|
|
|
|
<!-- OPTIONAL: (MANDATORY: for session management by URL rewriting)
|
|
Useful for WebApplications: if a HTTP session is not cookie based, URL rewriting is beeing used (the session is appended to the URL).
|
|
This URL session is used for example when links to graphics are created by XSLT. Otherwise the user havt to log again in for every graphic he liks to see. -->
|
|
<xsl:param name="optionalURLSuffix" />
|
|
|
|
<!-- OPTIONAL: URL to office meta file (flat xml use the URL to the input file) -->
|
|
<xsl:param name="metaFileURL" />
|
|
|
|
<!-- OPTIONAL: URL to office meta file (flat xml use the URL to the input file) -->
|
|
<xsl:param name="stylesFileURL" />
|
|
|
|
<!-- OPTIONAL: in case of using a different processor than a JAVA XSLT, you can unable the Java functionality
|
|
(e.g. encoding chapter names for the content-table as href and anchors ) -->
|
|
<xsl:param name="java" select="true()" />
|
|
<xsl:param name="javaEnabled" select="boolean($java)" />
|
|
|
|
<!-- OPTIONAL: for activating the debug mode set the variable here to 'true()' or give any value from outside -->
|
|
<xsl:param name="debug" select="false()" />
|
|
<xsl:param name="debugEnabled" select="boolean($debug)" />
|
|
|
|
<!-- matching configuration entries -->
|
|
<xsl:key name="config" use="@config:name"
|
|
match="/*/office:settings/config:config-item-set/config:config-item-map-indexed/config:config-item-map-entry/config:config-item |
|
|
/*/office:settings/config:config-item-set/config:config-item-map-indexed/config:config-item-map-entry/config:config-item-map-named/config:config-item-map-entry/config:config-item" />
|
|
|
|
<xsl:key name="colors" match="/*/office:styles//@*[name() = 'fo:background-color' or name() = 'fo:color'] |
|
|
/*/office:automatic-styles//@*[name() = 'fo:background-color' or name() = 'fo:color']" use="/" />
|
|
<xsl:key name="colorRGB" match="@fo:background-color | @fo:color" use="." />
|
|
<!-- *************************** -->
|
|
<!-- *** Built up Excel file *** -->
|
|
<!-- *************************** -->
|
|
<xsl:template match="/">
|
|
<xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
|
|
<!-- Note: for debugging purpose include schema location
|
|
<Workbook xsi:schemaLocation="urn:schemas-microsoft-com:office:spreadsheet <YOUR_SCHEMA_URL>/excelss.xsd"> -->
|
|
<Workbook>
|
|
<!-- adding some default settings -->
|
|
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
|
|
<Colors>
|
|
<xsl:for-each select="key('colors', /)
|
|
[generate-id(.) =
|
|
generate-id(key('colorRGB', .)[1]) and starts-with(., '#')] ">
|
|
<xsl:sort select="." />
|
|
<Color>
|
|
<Index><xsl:value-of select="position() + 2" /></Index>
|
|
<RGB><xsl:value-of select="." /></RGB>
|
|
</Color>
|
|
</xsl:for-each>
|
|
<xsl:for-each select="key('config', 'TabColor')[not(.=preceding::config:config-item)]">
|
|
<xsl:sort select="." />
|
|
<Color>
|
|
<Index><xsl:value-of select="56 - position()" /></Index>
|
|
<RGB>
|
|
<xsl:call-template name="colordecimal2rgb">
|
|
<xsl:with-param name="colordecimal" select="."/>
|
|
</xsl:call-template>
|
|
</RGB>
|
|
</Color>
|
|
</xsl:for-each>
|
|
</Colors>
|
|
</OfficeDocumentSettings>
|
|
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
|
|
<xsl:if test="key('config', 'HasSheetTabs') = 'false'">
|
|
<xsl:element name="HideWorkbookTabs" />
|
|
</xsl:if>
|
|
<WindowHeight>9000</WindowHeight>
|
|
<WindowWidth>13860</WindowWidth>
|
|
<WindowTopX>240</WindowTopX>
|
|
<WindowTopY>75</WindowTopY>
|
|
<ProtectStructure>False</ProtectStructure>
|
|
<ProtectWindows>False</ProtectWindows>
|
|
</ExcelWorkbook>
|
|
<!-- Note: the following handling will exchange the default, later
|
|
<x:ExcelWorkbook>
|
|
<xsl:apply-templates select="table:calculation-settings" />
|
|
</x:ExcelWorkbook>
|
|
-->
|
|
<xsl:element name="Styles">
|
|
<!-- our application default will not be used for export to Excel
|
|
<xsl:apply-templates select="/*/office:styles/style:default-style" mode="styles" />-->
|
|
<xsl:apply-templates select="/*/office:styles/style:style" mode="styles" />
|
|
<xsl:apply-templates select="/*/office:automatic-styles/style:style" mode="styles" >
|
|
<xsl:with-param name="isAutomatic" select="true()" />
|
|
</xsl:apply-templates>
|
|
</xsl:element>
|
|
<xsl:apply-templates select="/*/office:body" />
|
|
</Workbook>
|
|
</xsl:template>
|
|
|
|
<xsl:template name="colordecimal2rgb">
|
|
<xsl:param name="colordecimal"/>
|
|
<xsl:choose>
|
|
<xsl:when test="$colordecimal <= 16777215 and $colordecimal >= 65536">
|
|
<xsl:variable name="redValue" select="floor(($colordecimal) div 65536)"/>
|
|
<xsl:variable name="greenValue" select="floor(($colordecimal - ($redValue*65536)) div 256)"/>
|
|
<xsl:variable name="blueValue" select="$colordecimal - ($redValue*65536) - ($greenValue*256)"/>
|
|
<xsl:call-template name="dec_rgb2Hex">
|
|
<xsl:with-param name="decRedValue" select="$redValue"/>
|
|
<xsl:with-param name="decGreenValue" select="$greenValue"/>
|
|
<xsl:with-param name="decBlueValue" select="$blueValue"/>
|
|
</xsl:call-template>
|
|
</xsl:when>
|
|
<xsl:when test="$colordecimal <= 65535 and $colordecimal >= 256">
|
|
<xsl:variable name="redValue" select="0"/>
|
|
<xsl:variable name="greenValue" select="$colordecimal div 256"/>
|
|
<xsl:variable name="blueValue" select="$colordecimal - ($greenValue*256)"/>
|
|
<xsl:call-template name="dec_rgb2Hex">
|
|
<xsl:with-param name="decRedValue" select="$redValue"/>
|
|
<xsl:with-param name="decGreenValue" select="$greenValue"/>
|
|
<xsl:with-param name="decBlueValue" select="$blueValue"/>
|
|
</xsl:call-template>
|
|
</xsl:when>
|
|
<xsl:when test="$colordecimal <= 255 and $colordecimal >= 0">
|
|
<xsl:variable name="redValue" select="0"/>
|
|
<xsl:variable name="greenValue" select="0"/>
|
|
<xsl:variable name="blueValue" select="$colordecimal"/>
|
|
<xsl:call-template name="dec_rgb2Hex">
|
|
<xsl:with-param name="decRedValue" select="$redValue"/>
|
|
<xsl:with-param name="decGreenValue" select="$greenValue"/>
|
|
<xsl:with-param name="decBlueValue" select="$blueValue"/>
|
|
</xsl:call-template>
|
|
</xsl:when>
|
|
<xsl:otherwise/>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
<xsl:template name="dec_rgb2Hex">
|
|
<xsl:param name="decRedValue"/>
|
|
<xsl:param name="decGreenValue"/>
|
|
<xsl:param name="decBlueValue"/>
|
|
<xsl:variable name="hexRedValue">
|
|
<xsl:variable name="tmpHexRedValue">
|
|
<xsl:call-template name="decimal2hex">
|
|
<xsl:with-param name="dec-number" select="$decRedValue"/>
|
|
<xsl:with-param name="last-value" select="'H'"/>
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
<xsl:choose>
|
|
<xsl:when test="string-length($tmpHexRedValue) = 1">
|
|
<xsl:value-of select="concat('0',$tmpHexRedValue)"/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:value-of select="$tmpHexRedValue"/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:variable>
|
|
<xsl:variable name="hexGreenValue">
|
|
<xsl:variable name="tmpHexGreenValue">
|
|
<xsl:call-template name="decimal2hex">
|
|
<xsl:with-param name="dec-number" select="$decGreenValue"/>
|
|
<xsl:with-param name="last-value" select="'H'"/>
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
<xsl:choose>
|
|
<xsl:when test="string-length($tmpHexGreenValue) = 1">
|
|
<xsl:value-of select="concat('0',$tmpHexGreenValue)"/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:value-of select="$tmpHexGreenValue"/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:variable>
|
|
<xsl:variable name="hexBlueValue">
|
|
<xsl:variable name="tmpHexBlueValue">
|
|
<xsl:call-template name="decimal2hex">
|
|
<xsl:with-param name="dec-number" select="$decBlueValue"/>
|
|
<xsl:with-param name="last-value" select="'H'"/>
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
<xsl:choose>
|
|
<xsl:when test="string-length($tmpHexBlueValue) = 1">
|
|
<xsl:value-of select="concat('0',$tmpHexBlueValue)"/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:value-of select="$tmpHexBlueValue"/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:variable>
|
|
<xsl:value-of select="concat('#',$hexRedValue,$hexGreenValue,$hexBlueValue)"/>
|
|
</xsl:template>
|
|
<xsl:template name="decimal2hex">
|
|
<!-- transforms a decimal number to a hex number,only for two-bit hex(less than 256 in decimal) currently -->
|
|
<xsl:param name="dec-number"/>
|
|
<xsl:param name="last-value"/>
|
|
<xsl:variable name="current-value">
|
|
<xsl:call-template name="decNumber2hex">
|
|
<xsl:with-param name="dec-value">
|
|
<xsl:if test="$dec-number > 15">
|
|
<xsl:value-of select="floor($dec-number div 16)"/>
|
|
</xsl:if>
|
|
<xsl:if test="$dec-number < 16">
|
|
<xsl:value-of select="$dec-number"/>
|
|
</xsl:if>
|
|
</xsl:with-param>
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
<xsl:if test="$dec-number > 15">
|
|
<xsl:call-template name="decimal2hex">
|
|
<xsl:with-param name="dec-number" select="$dec-number mod 16"/>
|
|
<xsl:with-param name="last-value" select="concat($last-value,$current-value)"/>
|
|
</xsl:call-template>
|
|
</xsl:if>
|
|
<xsl:if test="$dec-number < 16">
|
|
<xsl:value-of select="substring-after(concat($last-value,$current-value),'H')"/>
|
|
</xsl:if>
|
|
</xsl:template>
|
|
|
|
<xsl:template name="decNumber2hex">
|
|
<!-- return a hex number for a decimal character -->
|
|
<xsl:param name="dec-value"/>
|
|
<xsl:choose>
|
|
<xsl:when test="$dec-value = 10">
|
|
<xsl:value-of select="'A'"/>
|
|
</xsl:when>
|
|
<xsl:when test="$dec-value = 11">
|
|
<xsl:value-of select="'B'"/>
|
|
</xsl:when>
|
|
<xsl:when test="$dec-value = 12">
|
|
<xsl:value-of select="'C'"/>
|
|
</xsl:when>
|
|
<xsl:when test="$dec-value = 13">
|
|
<xsl:value-of select="'D'"/>
|
|
</xsl:when>
|
|
<xsl:when test="$dec-value = 14">
|
|
<xsl:value-of select="'E'"/>
|
|
</xsl:when>
|
|
<xsl:when test="$dec-value = 15">
|
|
<xsl:value-of select="'F'"/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:value-of select="$dec-value"/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
<xsl:template name="GetTabColorIndex">
|
|
<xsl:param name="SheetColor"/>
|
|
<xsl:for-each select="key('config', 'TabColor')[not(.=preceding::config:config-item)]">
|
|
<xsl:sort select="." />
|
|
<xsl:variable name="tmpColor" select="."/>
|
|
<xsl:if test=". = $SheetColor" >
|
|
<xsl:value-of select="56 - position()"/>
|
|
</xsl:if>
|
|
</xsl:for-each>
|
|
</xsl:template>
|
|
<xsl:template match="office:body">
|
|
<!-- office:body table:table children are spreadsheets -->
|
|
<xsl:apply-templates />
|
|
</xsl:template>
|
|
|
|
<xsl:template match="office:spreadsheet">
|
|
<xsl:apply-templates />
|
|
</xsl:template>
|
|
|
|
<!-- office:body table:table children are spreadsheets -->
|
|
<xsl:template match="office:spreadsheet/table:table">
|
|
<xsl:element name="ss:Worksheet">
|
|
<xsl:variable name="TableName">
|
|
<xsl:value-of select="@table:name" />
|
|
</xsl:variable>
|
|
<xsl:attribute name="ss:Name">
|
|
<xsl:value-of select="$TableName" />
|
|
</xsl:attribute>
|
|
<xsl:call-template name="table:table" />
|
|
<xsl:element name="x:WorksheetOptions">
|
|
<xsl:if test="key('config', 'ShowGrid') = 'false'">
|
|
<xsl:element name="x:DoNotDisplayGridlines" />
|
|
</xsl:if>
|
|
<xsl:if test="key('config', 'HasColumnRowHeaders') = 'false'">
|
|
<xsl:element name="x:DoNotDisplayHeadings" />
|
|
</xsl:if>
|
|
<xsl:if test="key('config', 'IsOutlineSymbolsSet') = 'false'">
|
|
<xsl:element name="x:DoNotDisplayOutline" />
|
|
</xsl:if>
|
|
<xsl:if test="key('config', 'ShowZeroValues') = 'false'">
|
|
<xsl:element name="x:DoNotDisplayZeros" />
|
|
</xsl:if>
|
|
<xsl:if test="/*/office:settings/config:config-item-set/config:config-item-map-indexed/config:config-item-map-entry/config:config-item-map-named/config:config-item-map-entry[@config:name=$TableName]/config:config-item[@config:name='TabColor']">
|
|
<xsl:element name="x:TabColorIndex">
|
|
<xsl:variable name="TabColorIndex">
|
|
<xsl:call-template name="GetTabColorIndex">
|
|
<xsl:with-param name="SheetColor" select="/*/office:settings/config:config-item-set/config:config-item-map-indexed/config:config-item-map-entry/config:config-item-map-named/config:config-item-map-entry[@config:name=$TableName]/config:config-item[@config:name='TabColor']"/>
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
<xsl:value-of select="$TabColorIndex"/>
|
|
</xsl:element>
|
|
</xsl:if>
|
|
</xsl:element>
|
|
</xsl:element>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="table:decls" mode="ExcelWorkbook">
|
|
<xsl:apply-templates mode="ExcelWorkbook" />
|
|
</xsl:template>
|
|
|
|
<xsl:template match="table:calculation-settings" mode="ExcelWorkbook">
|
|
<xsl:if test="table:precision-as-shown">
|
|
<x:PrecisionAsDisplayed/>
|
|
</xsl:if>
|
|
<xsl:if test="table:null-date/@office:date-value='1904-01-01'">
|
|
<x:Date1904/>
|
|
</xsl:if>
|
|
<xsl:apply-templates select="table:iteration" />
|
|
</xsl:template>
|
|
|
|
<xsl:template match="table:iteration" mode="ExcelWorkbook">
|
|
<xsl:element name="x:ExcelWorkbook">
|
|
<xsl:if test="@table:status = 'enable'">
|
|
<x:Iteration/>
|
|
</xsl:if>
|
|
<xsl:if test="@table:steps">
|
|
<xsl:element name="x:MaxIterations">
|
|
<xsl:value-of select="@table:steps" />
|
|
</xsl:element>
|
|
</xsl:if>
|
|
<xsl:if test="@table:maximum-difference">
|
|
<xsl:element name="x:MaxChange">
|
|
<xsl:value-of select="@table:maximum-difference" />
|
|
</xsl:element>
|
|
</xsl:if>
|
|
</xsl:element>
|
|
</xsl:template>
|
|
|
|
</xsl:stylesheet>
|