filter/Library_xsltfilter.mk | 1 filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl | 976 ++++------ filter/source/xsltfilter/LibXSLTTransformer.cxx | 6 libxslt/libxsltversion.mk | 3 libxslt/makefile.mk | 1 libxslt/prj/d.lst | 2 scp2/source/ooo/file_library_ooo.scp | 18 scp2/source/ooo/module_hidden_ooo.scp | 11 solenv/inc/libs.mk | 6 9 files changed, 530 insertions(+), 494 deletions(-)
New commits: commit 1c467763f4ca4bc1caaa3111f0ed85f388e6fe01 Author: Peter Jentsch <pj...@guineapics.de> Date: Sat Sep 8 22:26:50 2012 +0200 build and deliver internal libexslt. Use LIBEXSLT_LIBS is system xslt is used Change-Id: I7ab624bc4877af51d4182ab213ef49cd8c5bb2a4 diff --git a/filter/Library_xsltfilter.mk b/filter/Library_xsltfilter.mk index 9688d59..94fca81 100644 --- a/filter/Library_xsltfilter.mk +++ b/filter/Library_xsltfilter.mk @@ -43,6 +43,7 @@ $(eval $(call gb_Library_use_libraries,xsltfilter,\ $(eval $(call gb_Library_use_externals,xsltfilter,\ libxml2 \ libxslt \ + libexslt \ )) $(eval $(call gb_Library_add_exception_objects,xsltfilter,\ diff --git a/libxslt/libxsltversion.mk b/libxslt/libxsltversion.mk index c80c0e9..e7fe5e5 100644 --- a/libxslt/libxsltversion.mk +++ b/libxslt/libxsltversion.mk @@ -26,8 +26,11 @@ #************************************************************************* # major LIBXSLT_MAJOR=1 +LIBEXSLT_MAJOR=0 # minor LIBXSLT_MINOR=1 +LIBEXSLT_MINOR=8 # micro LIBXSLT_MICRO=26 +LIBEXSLT_MICRO=15 diff --git a/libxslt/makefile.mk b/libxslt/makefile.mk index 670ebb9..9d4deff 100644 --- a/libxslt/makefile.mk +++ b/libxslt/makefile.mk @@ -159,6 +159,7 @@ BUILD_DIR=$(CONFIGURE_DIR) .ENDIF OUT2INC=libxslt$/*.h +OUT2INC+=libexslt$/*.h .IF "$(OS)"=="MACOSX" OUT2LIB+=libxslt$/.libs$/libxslt.*.dylib diff --git a/libxslt/prj/d.lst b/libxslt/prj/d.lst index f3613b0..892df7b 100644 --- a/libxslt/prj/d.lst +++ b/libxslt/prj/d.lst @@ -1,5 +1,7 @@ mkdir: %_DEST%\inc\external\libxslt +mkdir: %_DEST%\inc\external\libexslt ..\%__SRC%\inc\*.h %_DEST%\inc\external\libxslt\*.h +..\%__SRC%\inc\exslt*.h %_DEST%\inc\external\libexslt\*.h ..\%__SRC%\lib\libxslt.1.dylib %_DEST%\lib\libxslt.1.dylib symlink: %_DEST%\lib\libxslt.1.dylib %_DEST%\lib\libxslt.dylib ...\%__SRC%\lib\libexslt.so %_DEST%\lib\libexslt.so diff --git a/scp2/source/ooo/file_library_ooo.scp b/scp2/source/ooo/file_library_ooo.scp index 928174b..8a20d07 100644 --- a/scp2/source/ooo/file_library_ooo.scp +++ b/scp2/source/ooo/file_library_ooo.scp @@ -1470,6 +1470,24 @@ File gid_File_Lib_Xslt #endif #endif End +File gid_File_Lib_eXslt + LIB_FILE_BODY; + Styles = (PACKED); + Dir = SCP2_OOO_BIN_DIR; + #ifdef UNX + #ifdef MACOSX + Name = STRING(CONCAT4(libexslt,.,0,UNXSUFFIX)); + #else + Name = STRING(CONCAT4(libexslt,UNXSUFFIX,.,0)); + #endif + #else + #ifdef _gcc3 + Name = "libexslt-0.dll"; + #else + Name = "libexslt.dll"; + #endif + #endif +End #endif diff --git a/scp2/source/ooo/module_hidden_ooo.scp b/scp2/source/ooo/module_hidden_ooo.scp index 26ec6d6..aa4ff72 100644 --- a/scp2/source/ooo/module_hidden_ooo.scp +++ b/scp2/source/ooo/module_hidden_ooo.scp @@ -70,6 +70,13 @@ Unixlink gid_Unixlink_File_Lib_Xslt Styles = (PACKED, VERSION_INDEPENDENT_COMP_ID); Target = STRING(CONCAT3(libxslt,UNXSUFFIX,.1)); End +Unixlink gid_Unixlink_File_Lib_eXslt + BIN_FILE_BODY; + Dir = SCP2_OOO_BIN_DIR; + Name = STRING(CONCAT2(libexslt,UNXSUFFIX)); + Styles = (PACKED, VERSION_INDEPENDENT_COMP_ID); + Target = STRING(CONCAT3(libexslt,UNXSUFFIX,.0)); +End #endif #endif @@ -431,6 +438,7 @@ Module gid_Module_Root_Files_5 gid_File_Lib_Ucppkg1, gid_File_Lib_Xslt, gid_Unixlink_File_Lib_Xslt, + gid_Unixlink_File_Lib_eXslt, gid_File_Lib_LibXMLSec_xmlsecnss, gid_File_Lib_LibXMLSec_xmlseccore, gid_File_Lib_LibXMLSec_xmlsecmscrypto, @@ -499,7 +507,8 @@ Module gid_Module_Root_Files_5 gid_Unixlink_File_Lib_Raptor, gid_Unixlink_File_Lib_Rasqal, gid_Unixlink_File_Lib_Rdf, - gid_Unixlink_File_Lib_Xslt); + gid_Unixlink_File_Lib_Xslt, + gid_Unixlink_File_Lib_eXslt); End Module gid_Module_Root_Files_6 diff --git a/solenv/inc/libs.mk b/solenv/inc/libs.mk index 1efcd22..b9e2a5d 100644 --- a/solenv/inc/libs.mk +++ b/solenv/inc/libs.mk @@ -252,9 +252,9 @@ CPPUNITLIB = $(CPPUNIT_LIBS) CPPUNITLIB = -lcppunit .ENDIF .IF "$(SYSTEM_LIBXSLT)"=="YES" -XSLTLIB=$(LIBXSLT_LIBS) +XSLTLIB=$(LIBEXSLT_LIBS) .ELSE -XSLTLIB=-lxslt $(LIBXML2LIB) +XSLTLIB=-lexslt -lxslt $(LIBXML2LIB) .ENDIF JVMFWKLIB = -ljvmfwk .IF "$(SYSTEM_REDLAND)"=="YES" @@ -491,7 +491,7 @@ PKGCHKLIB=ipkgchk.lib HELPLINKERLIB=ihelplinker.lib JVMACCESSLIB = ijvmaccess.lib CPPUNITLIB = icppunit_dll.lib -XSLTLIB = libxslt.lib $(LIBXML2LIB) +XSLTLIB = libexslt.lib libxslt.lib $(LIBXML2LIB) REDLANDLIB = librdf.lib JVMFWKLIB = ijvmfwk.lib commit eadb83f281b596e441a82798660f1a27c177b2c6 Author: Peter Jentsch <pj...@guineapics.de> Date: Sat May 5 23:45:56 2012 +0200 register exslt functions for libxslt filter Change-Id: I23bb8a3cf00a9152362794281a617ad4a780faee diff --git a/filter/source/xsltfilter/LibXSLTTransformer.cxx b/filter/source/xsltfilter/LibXSLTTransformer.cxx index ff57fc1..aa1411f 100644 --- a/filter/source/xsltfilter/LibXSLTTransformer.cxx +++ b/filter/source/xsltfilter/LibXSLTTransformer.cxx @@ -44,6 +44,7 @@ #include <libxslt/xsltutils.h> #include <libxslt/variables.h> #include <libxslt/extensions.h> +#include <libexslt/exslt.h> #include <cppuhelper/factory.hxx> #include <cppuhelper/servicefactory.hxx> @@ -323,7 +324,12 @@ namespace XSLT (const xmlChar *) m_transformer->getStyleSheetURL().getStr()); xmlDocPtr result = NULL; xsltTransformContextPtr tcontext = NULL; + exsltRegisterAll(); registerExtensionModule(); +#if OSL_DEBUG_LEVEL > 1 + xsltSetGenericDebugFunc(stderr, NULL); + xsltDebugDumpExtensions(NULL); +#endif OleHandler* oh = new OleHandler(m_transformer->getServiceFactory()); if (styleSheet) { commit b5107faa150aab3c5480708219fc8d392a97f718 Author: Peter Jentsch <pj...@guineapics.de> Date: Tue May 1 00:26:25 2012 +0200 add for exslt:set:distinct template ..for processors not supporting it natively, namely Saxon > 8.2 Change-Id: I33ceedd7f70f0469c039b8e90aa8d492d5c27ce2 diff --git a/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl b/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl index 15874f2..6258668 100644 --- a/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl +++ b/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl @@ -9145,4 +9145,25 @@ <xsl:param name="string"/> <xsl:value-of select="translate($string, '.%()/\+[]', '')"/> </xsl:template> + + <xsl:template name="set:distinct"> + <xsl:param name="nodes" select="/.."/> + <xsl:param name="distinct" select="/.."/> + <xsl:choose> + <xsl:when test="$nodes"> + <xsl:call-template name="set:distinct"> + <xsl:with-param name="distinct" select="$distinct | $nodes[1][not(. = $distinct)]"/> + <xsl:with-param name="nodes" select="$nodes[position() > 1]"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="$distinct" mode="set:distinct"/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match="node()|@*" mode="set:distinct"> + <xsl:copy-of select="." /> + </xsl:template> + </xsl:stylesheet> commit 9f29890d4e4fa916d46eeae081ef6e04eb1bfe81 Author: Peter Jentsch <pj...@guineapics.de> Date: Tue May 1 00:24:51 2012 +0200 fix a problem when handling style named for conditional formatting. Change-Id: Ia8deda31dc4624b1d05d2388c90dbcb17d033269 diff --git a/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl b/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl index 32e4259..15874f2 100644 --- a/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl +++ b/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl @@ -6981,23 +6981,29 @@ <xsl:with-param name="param-str" select="substring-before($condition-pos-str,$current-pos-str)"/> </xsl:call-template> </xsl:variable> + <xsl:variable name="base-style-name"> + <xsl:choose> + <xsl:when test="@ss:StyleID"> + <xsl:value-of select="@ss:StyleID"/> + </xsl:when> + <xsl:when test="../@ss:StyleID"> + <xsl:value-of select="../@ss:StyleID"/> + </xsl:when> + <xsl:when test="../../@ss:StyleID"> + <xsl:value-of select="../../@ss:StyleID"/> + </xsl:when> + </xsl:choose> + </xsl:variable> <xsl:variable name="style-name"> <xsl:choose> <xsl:when test="contains($condition-pos-str, $current-pos-str) and starts-with($temp-str, 'c')"> - <xsl:value-of select="concat(@ss:StyleID, '-ce', substring-after($temp-str, 'c'))"/> - </xsl:when> - <xsl:otherwise> <xsl:choose> - <xsl:when test="@ss:StyleID"> - <xsl:value-of select="@ss:StyleID"/> - </xsl:when> - <xsl:when test="../@ss:StyleID"> - <xsl:value-of select="../@ss:StyleID"/> - </xsl:when> - <xsl:when test="../../@ss:StyleID"> - <xsl:value-of select="../../@ss:StyleID"/> - </xsl:when> + <xsl:when test="string-length($base-style-name) > 0"><xsl:value-of select="concat($base-style-name, '-ce', substring-after($temp-str, 'c'))"/></xsl:when> + <xsl:otherwise><xsl:value-of select="concat('Default-ce', substring-after($temp-str, 'c'))"/></xsl:otherwise> </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$base-style-name"/> </xsl:otherwise> </xsl:choose> </xsl:variable> commit 3420be984986bcff03d6d127b913fc07372fe89f Author: Peter Jentsch <pj...@guineapics.de> Date: Tue May 1 00:24:01 2012 +0200 fixed problem with template recursion in spreadsheetml import. Changed recursion to iteration in various places (creating column styles and both row styles and rows) Recursion when creating cells/columns remains. Change-Id: Ie5d27c576069b79225e7901671227c0ff8dce75d diff --git a/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl b/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl index cd223f8..32e4259 100644 --- a/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl +++ b/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl @@ -5048,17 +5048,15 @@ <style:style style:family="table-column" style:name="{concat('co', $table-pos)}"> <style:table-column-properties fo:break-before="auto" style:column-width="{$default-column-width}"/> </style:style> - <xsl:choose> - <xsl:when test="ss:Column"> - <xsl:call-template name="get-column-style-name"> - <xsl:with-param name="finishedColumns" select="0"/> - <xsl:with-param name="columnCount" select="count(./ss:Column)"/> - <xsl:with-param name="currentCount" select="1"/> - <xsl:with-param name="table-pos" select="$table-pos"/> - <xsl:with-param name="default-column-width" select="$default-column-width"/> - </xsl:call-template> - </xsl:when> - </xsl:choose> + <xsl:variable name="columnCount" select="count(ss:Column)"/> + <xsl:for-each select="ss:Column"> + <xsl:apply-templates select="." mode="create-column-style"> + <xsl:with-param name="columnCount" select="$columnCount"/> + <xsl:with-param name="currentCount" select="position()"/> + <xsl:with-param name="table-pos" select="$table-pos"/> + <xsl:with-param name="default-column-width" select="$default-column-width"/> + </xsl:apply-templates> + </xsl:for-each> <xsl:if test="../x:PageBreaks/x:ColBreaks"> <style:style style:name="{concat('cob',$table-pos)}" style:family="table-column"> <xsl:element name="style:table-column-properties"> @@ -5085,15 +5083,15 @@ <style:style style:family="table-row" style:name="{concat('ro', $table-pos)}"> <style:table-row-properties style:row-height="{$default-row-height}" style:use-optimal-row-height="false"/> </style:style> - <xsl:if test="ss:Row"> - <xsl:call-template name="get-row-style-name"> - <xsl:with-param name="earlierRowNo" select="0"/> - <xsl:with-param name="rowNodeCount" select="count(./ss:Row)"/> - <xsl:with-param name="rowNodeIndex" select="1"/> + <xsl:variable name="rowCount" select="count(ss:Row)"/> + <xsl:for-each select="ss:Row"> + <xsl:apply-templates select="." mode="create-row-style"> + <xsl:with-param name="rowNodeCount" select="$rowCount"/> + <xsl:with-param name="rowNodeIndex" select="position()"/> <xsl:with-param name="table-pos" select="$table-pos"/> <xsl:with-param name="default-row-height" select="$default-row-height"/> - </xsl:call-template> - </xsl:if> + </xsl:apply-templates> + </xsl:for-each> <xsl:if test="../x:PageBreaks/x:RowBreaks"> <style:style style:name="{concat('rob',$table-pos)}" style:family="table-row"> <xsl:element name="style:table-row-properties"> @@ -5129,98 +5127,82 @@ </xsl:element> </xsl:element> </xsl:template> - <xsl:template name="get-column-style-name"> + <xsl:template match="ss:Column" mode="create-column-style"> <!-- generate stylename of colbreak after matching the column number and the colbreak number --> - <xsl:param name="finishedColumns"/> <xsl:param name="columnCount"/> <xsl:param name="currentCount"/> <xsl:param name="table-pos"/> <xsl:param name="default-column-width"/> - <xsl:if test="$currentCount < ($columnCount + 1)"> - <xsl:variable name="span-value"> - <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:Span"> - <xsl:value-of select="./ss:Column[position() = $currentCount]/@ss:Span + 1"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="0"/> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="current-index"> - <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:Index"> - <xsl:value-of select="./ss:Column[position() = $currentCount]/@ss:Index - 1"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="$finishedColumns"/> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="column-break"> - <xsl:choose> - <xsl:when test="$span-value = 0"> - <xsl:if test="../x:PageBreaks/x:ColBreaks/x:ColBreak/x:Column = $current-index"> - <xsl:value-of select="1"/> - </xsl:if> - </xsl:when> - <xsl:otherwise> - <xsl:if test="../x:PageBreaks/x:ColBreaks[(x:ColBreak/x:Column > $finishedColumns) and (x:ColBreak/x:Column < ($finishedColumns + $span-value))]"> - <xsl:value-of select="1"/> - </xsl:if> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:if test="$column-break = 1"> - <xsl:element name="style:style"> - <xsl:attribute name="style:name"> - <xsl:call-template name="encode-as-nc-name"> - <xsl:with-param name="string" select="concat('cob', $table-pos, '-',$currentCount)"/> - </xsl:call-template> - </xsl:attribute> - <xsl:attribute name="style:family">table-column</xsl:attribute> - <xsl:element name="style:table-column-properties"> - <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:Width"> - <xsl:attribute name="style:column-width"> - <xsl:call-template name="convert2cm"> - <xsl:with-param name="value" select="concat(./ss:Column[position() = $currentCount]/@ss:Width,'pt')"/> - </xsl:call-template> - <xsl:text>cm</xsl:text> - </xsl:attribute> - </xsl:when> - <xsl:otherwise> - <xsl:attribute name="style:column-width"> - <xsl:value-of select="$default-column-width"/> - </xsl:attribute> - </xsl:otherwise> - </xsl:choose> - <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:AutoFitWidth = '0'"> - <xsl:attribute name="style:use-optimal-column-width">false</xsl:attribute> - </xsl:when> - <xsl:otherwise> - <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:Width > 0"> - <xsl:attribute name="style:use-optimal-column-width">false</xsl:attribute> - </xsl:when> - <xsl:otherwise> - <xsl:attribute name="style:use-optimal-column-width">true</xsl:attribute> - </xsl:otherwise> - </xsl:choose> - </xsl:otherwise> - </xsl:choose> - <xsl:attribute name="fo:break-before">page</xsl:attribute> - </xsl:element> - </xsl:element> - </xsl:if> - <style:style style:name="{concat('co', $table-pos, '-',$currentCount)}" style:family="table-column"> + <xsl:variable name="span-value" select="@ss:Span + count(@ss:Span)"/> + <xsl:variable name="finishedColumns"> + <xsl:choose> + <xsl:when test="@ss:Index"> + <xsl:value-of select="@ss:Index -1 + $span-value"/> + </xsl:when> + <xsl:otherwise> + <xsl:variable name="recent-index" + select="preceding-sibling::*[@ss:Index][last()]"/> + <xsl:choose> + <xsl:when test="$recent-index"> + <xsl:variable name="nodes-up-to-current" + select="set:intersection(preceding-sibling::*, $recent-index/following-sibling::*)"/> + <xsl:variable name="allSpans" select="$nodes-up-to-current/@ss:Span"/> + <xsl:value-of + select="$recent-index/@ss:Index + count($nodes-up-to-current) + sum($allSpans) + count($allSpans)" + /> + </xsl:when> + <xsl:otherwise> + <xsl:variable name="allSpans" select="preceding-sibling::*/@ss:Span"/> + + <xsl:value-of select="$currentCount + sum($allSpans) + count($allSpans)"/> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="current-index"> + <xsl:choose> + <xsl:when test="@ss:Index"> + <xsl:value-of select="@ss:Index - 1"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$finishedColumns"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="column-break"> + <xsl:choose> + <xsl:when test="$span-value = 0"> + <xsl:if test="../x:PageBreaks/x:ColBreaks/x:ColBreak/x:Column = $current-index"> + <xsl:value-of select="1"/> + </xsl:if> + </xsl:when> + <xsl:otherwise> + <xsl:if + test="../x:PageBreaks/x:ColBreaks[(x:ColBreak/x:Column > $finishedColumns) and (x:ColBreak/x:Column < ($finishedColumns + $span-value))]"> + <xsl:value-of select="1"/> + </xsl:if> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:if test="$column-break = 1"> + <xsl:element name="style:style"> + <xsl:attribute name="style:name"> + <xsl:call-template name="encode-as-nc-name"> + <xsl:with-param name="string" + select="concat('cob', $table-pos, '-',$currentCount)"/> + </xsl:call-template> + </xsl:attribute> + <xsl:attribute name="style:family">table-column</xsl:attribute> <xsl:element name="style:table-column-properties"> <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:Width"> + <xsl:when test="@ss:Width"> <xsl:attribute name="style:column-width"> <xsl:call-template name="convert2cm"> - <xsl:with-param name="value" select="concat(./ss:Column[position() = $currentCount]/@ss:Width,'pt')"/> + <xsl:with-param name="value" + select="concat(@ss:Width,'pt')" + /> </xsl:call-template> <xsl:text>cm</xsl:text> </xsl:attribute> @@ -5231,172 +5213,150 @@ </xsl:attribute> </xsl:otherwise> </xsl:choose> - <xsl:attribute name="fo:break-before">auto</xsl:attribute> + <xsl:choose> + <xsl:when + test="@ss:AutoFitWidth = '0'"> + <xsl:attribute name="style:use-optimal-column-width" + >false</xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when + test="@ss:Width > 0"> + <xsl:attribute name="style:use-optimal-column-width" + >false</xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="style:use-optimal-column-width" + >true</xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + <xsl:attribute name="fo:break-before">page</xsl:attribute> </xsl:element> - </style:style> - <xsl:if test="$currentCount < $columnCount"> - <xsl:call-template name="get-column-style-name"> - <xsl:with-param name="finishedColumns"> - <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:Index"> - <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:Span"> - <xsl:value-of select="./ss:Column[position() = $currentCount]/@ss:Index + ./ss:Column[position() = $currentCount]/@ss:Span"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="./ss:Column[position() = $currentCount]/@ss:Index"/> - </xsl:otherwise> - </xsl:choose> - </xsl:when> - <xsl:otherwise> - <xsl:choose> - <xsl:when test="./ss:Column[position() = $currentCount]/@ss:Span"> - <xsl:value-of select="$finishedColumns + ./ss:Column[position() = $currentCount]/@ss:Span + 1"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="$finishedColumns + 1"/> - </xsl:otherwise> - </xsl:choose> - </xsl:otherwise> - </xsl:choose> - </xsl:with-param> - <xsl:with-param name="columnCount" select="$columnCount"/> - <xsl:with-param name="currentCount" select="$currentCount + 1"/> - <xsl:with-param name="table-pos" select="$table-pos"/> - <xsl:with-param name="default-column-width" select="$default-column-width"/> - </xsl:call-template> - </xsl:if> + </xsl:element> </xsl:if> - </xsl:template> - <xsl:template name="get-row-style-name"> - <!-- generate stylename of rowbreak after matching the row number and the rowbreak number --> - <xsl:param name="earlierRowNo"/> - <xsl:param name="rowNodeCount"/> - <xsl:param name="rowNodeIndex"/> - <xsl:param name="table-pos"/> - <xsl:param name="default-row-height"/> - <xsl:if test="$rowNodeIndex < ($rowNodeCount + 1)"> - <xsl:variable name="span-value"> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Index"> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Span"> - <xsl:value-of select="./ss:Row[position() = $rowNodeIndex]/@ss:Index - $earlierRowNo+ ./ss:Row[position() = $rowNodeIndex]/@ss:Span"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="0"/> - </xsl:otherwise> - </xsl:choose> - </xsl:when> - <xsl:otherwise> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Span"> - <xsl:value-of select="./ss:Row[position() = $rowNodeIndex]/@ss:Span + 1"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="0"/> - </xsl:otherwise> - </xsl:choose> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="current-index"> + <style:style style:name="{concat('co', $table-pos, '-',$currentCount)}" + style:family="table-column"> + <xsl:element name="style:table-column-properties"> <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Index"> - <xsl:value-of select="./ss:Row[position() = $rowNodeIndex]/@ss:Index - 1"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="$earlierRowNo"/> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="row-break"> - <xsl:choose> - <xsl:when test="$span-value = 0"> - <xsl:if test="../x:PageBreaks/x:RowBreaks/x:RowBreak/x:Row = $current-index"> - <xsl:value-of select="1"/> - </xsl:if> + <xsl:when test="@ss:Width"> + <xsl:attribute name="style:column-width"> + <xsl:call-template name="convert2cm"> + <xsl:with-param name="value" + select="concat(@ss:Width,'pt')" + /> + </xsl:call-template> + <xsl:text>cm</xsl:text> + </xsl:attribute> </xsl:when> <xsl:otherwise> - <xsl:if test="../x:PageBreaks/x:RowBreaks[(x:RowBreak/x:Row > $earlierRowNo) and (x:RowBreak/x:Row < ($earlierRowNo + $span-value))]"> - <xsl:value-of select="1"/> - </xsl:if> + <xsl:attribute name="style:column-width"> + <xsl:value-of select="$default-column-width"/> + </xsl:attribute> </xsl:otherwise> </xsl:choose> - </xsl:variable> - <xsl:if test="$row-break = 1"> - <xsl:element name="style:style"> + <xsl:attribute name="fo:break-before">auto</xsl:attribute> + </xsl:element> + </style:style> + </xsl:template> + + <xsl:template match="ss:Row" mode="create-row-style"> + <!-- generate stylename of rowbreak after matching the row number and the rowbreak number --> + <xsl:param name="rowNodeCount"/> + <xsl:param name="rowNodeIndex" select="position()"/> + <xsl:param name="table-pos"/> + <xsl:param name="default-row-height"/> + <xsl:variable name="simple-span-value" select="@ss:Span + count(@ss:Span)"/> + + <xsl:variable name="earlierRowNo"> + <xsl:choose> + <xsl:when test="@ss:Index"><xsl:value-of select="@ss:Index -1 + $simple-span-value"/></xsl:when> + <xsl:otherwise> + <xsl:variable name="recent-index" select="preceding-sibling::*[@ss:Index][last()]"></xsl:variable> <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:StyleID"> - <xsl:attribute name="style:name"><xsl:value-of select="concat('ro', $table-pos, '-',$rowNodeIndex,'-',ss:Row[position() = $rowNodeIndex]/@ss:StyleID)"/></xsl:attribute> + <xsl:when test="$recent-index"> + <xsl:variable name="nodes-up-to-current" select="set:intersection(preceding-sibling::*, $recent-index/following-sibling::*)"></xsl:variable> + <xsl:variable name="allSpans" select="$nodes-up-to-current/@ss:Span"/> + <xsl:value-of select="$recent-index/@ss:Index + count($nodes-up-to-current) + sum($allSpans) + count($allSpans)"/> </xsl:when> <xsl:otherwise> - <xsl:attribute name="style:name"><xsl:value-of select="concat('ro', $table-pos, '-',$rowNodeIndex)"/></xsl:attribute> + <xsl:variable name="allSpans" select="preceding-sibling::*/@ss:Span"/> + <xsl:value-of select="position() + sum($allSpans) + count($allSpans)"/> </xsl:otherwise> </xsl:choose> - <xsl:attribute name="style:family">table-row</xsl:attribute> - - - <xsl:element name="style:table-row-properties"> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Height"> - <xsl:attribute name="style:row-height"> - <xsl:call-template name="convert2cm"> - <xsl:with-param name="value" select="concat(./ss:Row[position() = $rowNodeIndex]/@ss:Height,'pt')"/> - </xsl:call-template> - <xsl:text>cm</xsl:text> - </xsl:attribute> - </xsl:when> - <xsl:otherwise> - <xsl:attribute name="style:row-height"> - <xsl:value-of select="$default-row-height"/> - </xsl:attribute> - </xsl:otherwise> - </xsl:choose> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:AutoFitHeight = '0'"> - <xsl:attribute name="style:use-optimal-row-height">false</xsl:attribute> - </xsl:when> - <xsl:otherwise> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Height > 0"> - <xsl:attribute name="style:use-optimal-row-height">false</xsl:attribute> - </xsl:when> - <xsl:otherwise> - <xsl:attribute name="style:use-optimal-row-height">true</xsl:attribute> - </xsl:otherwise> - </xsl:choose> - </xsl:otherwise> - </xsl:choose> - <xsl:attribute name="fo:break-before">page</xsl:attribute> - <xsl:apply-templates select="key('Style', ss:Row[position() = $rowNodeIndex]/@ss:StyleID)/ss:Interior" mode="style-style-content"/> - </xsl:element> - <!-- - <xsl:apply-templates select="key('Style', ss:Row[position() = $rowNodeIndex]/@ss:StyleID)" mode="style-style-content" /> - --> - </xsl:element> - </xsl:if> - <!-- - <style:style style:name="{concat('ro', $table-pos, '-',$rowNodeIndex)}" style:family="table-row"> - --> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="span-value"> + <xsl:choose> + <xsl:when test="@ss:Index"> + <xsl:choose> + <xsl:when test="@ss:Span"> + <xsl:value-of select="@ss:Index - $earlierRowNo + @ss:Span"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="0"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="@ss:Span"> + <xsl:value-of select="@ss:Span + 1"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="0"/> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="current-index"> + <xsl:choose> + <xsl:when test="@ss:Index"> + <xsl:value-of select="@ss:Index - 1"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$earlierRowNo"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="row-break"> + <xsl:choose> + <xsl:when test="$span-value = 0"> + <xsl:if test="../x:PageBreaks/x:RowBreaks/x:RowBreak/x:Row = $current-index"> + <xsl:value-of select="1"/> + </xsl:if> + </xsl:when> + <xsl:otherwise> + <xsl:if test="../x:PageBreaks/x:RowBreaks[(x:RowBreak/x:Row > $earlierRowNo) and (x:RowBreak/x:Row < ($earlierRowNo + $span-value))]"> + <xsl:value-of select="1"/> + </xsl:if> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:if test="$row-break = 1"> <xsl:element name="style:style"> <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:StyleID"> - <xsl:attribute name="style:name"><xsl:value-of select="concat('ro', $table-pos, '-',$rowNodeIndex,'-',ss:Row[position() = $rowNodeIndex]/@ss:StyleID)"/></xsl:attribute> + <xsl:when test="@ss:StyleID"> + <xsl:attribute name="style:name"><xsl:value-of select="concat('ro', $table-pos, '-',$rowNodeIndex,'-',@ss:StyleID)"/></xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:attribute name="style:name"><xsl:value-of select="concat('ro', $table-pos, '-',$rowNodeIndex)"/></xsl:attribute> </xsl:otherwise> </xsl:choose> <xsl:attribute name="style:family">table-row</xsl:attribute> - - + + <xsl:element name="style:table-row-properties"> <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Height"> + <xsl:when test="@ss:Height"> <xsl:attribute name="style:row-height"> <xsl:call-template name="convert2cm"> - <xsl:with-param name="value" select="concat(./ss:Row[position() = $rowNodeIndex]/@ss:Height,'pt')"/> + <xsl:with-param name="value" select="concat(@ss:Height,'pt')"/> </xsl:call-template> <xsl:text>cm</xsl:text> </xsl:attribute> @@ -5408,19 +5368,12 @@ </xsl:otherwise> </xsl:choose> <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:AutoFitHeight"> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:AutoFitHeight = '0'"> - <xsl:attribute name="style:use-optimal-row-height">false</xsl:attribute> - </xsl:when> - <xsl:otherwise> - <xsl:attribute name="style:use-optimal-row-height">true</xsl:attribute> - </xsl:otherwise> - </xsl:choose> + <xsl:when test="@ss:AutoFitHeight = '0'"> + <xsl:attribute name="style:use-optimal-row-height">false</xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Height > 0"> + <xsl:when test="@ss:Height > 0"> <xsl:attribute name="style:use-optimal-row-height">false</xsl:attribute> </xsl:when> <xsl:otherwise> @@ -5429,48 +5382,79 @@ </xsl:choose> </xsl:otherwise> </xsl:choose> - <xsl:attribute name="fo:break-before">auto</xsl:attribute> - <!-- apply to background --> - <xsl:apply-templates select="key('Style', ss:Row[position() = $rowNodeIndex]/@ss:StyleID)/ss:Interior" mode="style-style-content"/> + <xsl:attribute name="fo:break-before">page</xsl:attribute> + <xsl:apply-templates select="key('Style', @ss:StyleID)/ss:Interior" mode="style-style-content"/> </xsl:element> <!-- - <xsl:apply-templates select="key('Style', ss:Row[position() = $rowNodeIndex]/@ss:StyleID)" mode="style-style-content" /> + <xsl:apply-templates select="key('Style', @ss:StyleID)" mode="style-style-content" /> --> </xsl:element> - <xsl:if test="$rowNodeIndex < $rowNodeCount"> - <xsl:call-template name="get-row-style-name"> - <xsl:with-param name="earlierRowNo"> + </xsl:if> + <!-- + <style:style style:name="{concat('ro', $table-pos, '-',$rowNodeIndex)}" style:family="table-row"> + --> + <xsl:element name="style:style"> + <xsl:choose> + <xsl:when test="@ss:StyleID"> + <xsl:attribute name="style:name"><xsl:value-of select="concat('ro', $table-pos, '-',$rowNodeIndex,'-',@ss:StyleID)"/></xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="style:name"><xsl:value-of select="concat('ro', $table-pos, '-',$rowNodeIndex)"/></xsl:attribute> + </xsl:otherwise> + </xsl:choose> + <xsl:attribute name="style:family">table-row</xsl:attribute> + + + <xsl:element name="style:table-row-properties"> + <xsl:choose> + <xsl:when test="@ss:Height"> + <xsl:attribute name="style:row-height"> + <xsl:call-template name="convert2cm"> + <xsl:with-param name="value" select="concat(@ss:Height,'pt')"/> + </xsl:call-template> + <xsl:text>cm</xsl:text> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="style:row-height"> + <xsl:value-of select="$default-row-height"/> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + <xsl:choose> + <xsl:when test="@ss:AutoFitHeight"> <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Index"> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Span"> - <xsl:value-of select="./ss:Row[position() = $rowNodeIndex]/@ss:Index + ./ss:Row[position() = $rowNodeIndex]/@ss:Span"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="./ss:Row[position() = $rowNodeIndex]/@ss:Index"/> - </xsl:otherwise> - </xsl:choose> + <xsl:when test="@ss:AutoFitHeight = '0'"> + <xsl:attribute name="style:use-optimal-row-height">false</xsl:attribute> </xsl:when> <xsl:otherwise> - <xsl:choose> - <xsl:when test="./ss:Row[position() = $rowNodeIndex]/@ss:Span"> - <xsl:value-of select="$earlierRowNo + ./ss:Row[position() = $rowNodeIndex]/@ss:Span + 1"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="$earlierRowNo + 1"/> - </xsl:otherwise> - </xsl:choose> + <xsl:attribute name="style:use-optimal-row-height">true</xsl:attribute> </xsl:otherwise> </xsl:choose> - </xsl:with-param> - <xsl:with-param name="rowNodeCount" select="$rowNodeCount"/> - <xsl:with-param name="rowNodeIndex" select="$rowNodeIndex + 1"/> - <xsl:with-param name="table-pos" select="$table-pos"/> - <xsl:with-param name="default-row-height" select="$default-row-height"/> - </xsl:call-template> - </xsl:if> - </xsl:if> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="@ss:Height > 0"> + <xsl:attribute name="style:use-optimal-row-height">false</xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="style:use-optimal-row-height">true</xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + <xsl:attribute name="fo:break-before">auto</xsl:attribute> + <!-- apply to background --> + <xsl:apply-templates select="key('Style', @ss:StyleID)/ss:Interior" mode="style-style-content"/> + </xsl:element> + <!-- + <xsl:apply-templates select="key('Style', ss:Row[position() = $rowNodeIndex]/@ss:StyleID)" mode="style-style-content" /> + --> + </xsl:element> + + </xsl:template> + <xsl:template name="count-spanned-columns"> <xsl:param name="expandedColumnCount" select="0"/> <xsl:param name="columns"/> @@ -5582,9 +5566,25 @@ <xsl:variable name="condition-pos-str" select="concat($condition-pos-str1, $condition-pos-str2)"/> <xsl:choose> <xsl:when test="./ss:Table/ss:Row"> - <xsl:call-template name="create-rows"> - <xsl:with-param name="condition-pos-str" select="$condition-pos-str"/> - </xsl:call-template> + <xsl:variable name="worksheetNo" select="count(preceding-sibling::ss:Worksheet)+1"/> + <xsl:variable name="rowNodeCount" select="count(ss:Table/ss:Row)"/> + <xsl:variable name="expandedRowCount"> + <xsl:call-template name="get-expanded-row-count"/> + </xsl:variable> + <xsl:variable name="expandedColumnCount"> + <xsl:call-template name="get-expanded-column-count"/> + </xsl:variable> + <xsl:for-each select="ss:Table/ss:Row"> + <xsl:apply-templates select="." mode="create-rows"> + <xsl:with-param name="condition-pos-str" select="$condition-pos-str"/> + <xsl:with-param name="worksheetNo" select="$worksheetNo"/> + <xsl:with-param name="rowNodeCount" select="$rowNodeCount"/> + <xsl:with-param name="rowNodeIndex" select="position()"/> + <xsl:with-param name="expandedRowCount" select="$expandedRowCount"/> + <xsl:with-param name="expandedRowCountIndex" select="1"/> + <xsl:with-param name="expandedColumnCount" select="$expandedColumnCount"/> + </xsl:apply-templates> + </xsl:for-each> </xsl:when> <xsl:otherwise> <xsl:choose> @@ -5970,11 +5970,30 @@ <xsl:template match="ss:Row" mode="create-rows"> <xsl:param name="worksheetNo"/> <xsl:param name="rowNodeCount"/> - <xsl:param name="rowNodeIndex" select="1"/> + <xsl:param name="rowNodeIndex"/> <xsl:param name="expandedRowCount"/> - <xsl:param name="expandedRowCountIndex" select="1"/> <xsl:param name="expandedColumnCount"/> <xsl:param name="condition-pos-str"/> + <xsl:variable name="simple-span-value" select="@ss:Span + count(@ss:Span)"/> + <xsl:variable name="expandedRowCountIndex"> + <xsl:choose> + <xsl:when test="@ss:Index"><xsl:value-of select="@ss:Index -1 + $simple-span-value"/></xsl:when> + <xsl:otherwise> + <xsl:variable name="recent-index" select="preceding-sibling::*[@ss:Index][last()]"></xsl:variable> + <xsl:choose> + <xsl:when test="$recent-index"> + <xsl:variable name="nodes-up-to-current" select="set:intersection(preceding-sibling::*, $recent-index/following-sibling::*)"></xsl:variable> + <xsl:variable name="allSpans" select="$nodes-up-to-current/@ss:Span"/> + <xsl:value-of select="$recent-index/@ss:Index + count($nodes-up-to-current) + sum($allSpans) + count($allSpans)"/> + </xsl:when> + <xsl:otherwise> + <xsl:variable name="allSpans" select="preceding-sibling::*/@ss:Span"/> + <xsl:value-of select="$rowNodeIndex + sum($allSpans) + count($allSpans)"/> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> <xsl:variable name="currentRowNo"> <xsl:choose> <xsl:when test="@ss:Index"> @@ -6026,16 +6045,16 @@ <!-- Excel row without content --> <xsl:when test="not(*)"> <!-- OASIS OpenDocument Format does not allow rows without a cell --> - <xsl:choose> - <xsl:when test="$expandedColumnCount != 0"> - <table:table-cell table:number-columns-repeated="{$expandedColumnCount}"/> - </xsl:when> - <xsl:otherwise> - <!-- OASIS XML row can not be empty --> - <table:table-cell table:number-columns-repeated="256"/> - </xsl:otherwise> - </xsl:choose> - + <xsl:choose> + <xsl:when test="$expandedColumnCount != 0"> + <table:table-cell table:number-columns-repeated="{$expandedColumnCount}"/> + </xsl:when> + <xsl:otherwise> + <!-- OASIS XML row can not be empty --> + <table:table-cell table:number-columns-repeated="256"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> <xsl:otherwise> <xsl:call-template name="create-cells"> @@ -6046,53 +6065,9 @@ </xsl:otherwise> </xsl:choose> </xsl:element> - <!-- columns are painting over the expanded RowCount --> - <xsl:choose> - <xsl:when test="count(following-sibling::ss:Row) != 0"> - <xsl:apply-templates select="following-sibling::ss:Row[1]" mode="create-rows"> - <xsl:with-param name="worksheetNo" select="$worksheetNo"/> - <xsl:with-param name="rowNodeCount" select="$rowNodeCount"/> - <xsl:with-param name="rowNodeIndex" select="$rowNodeIndex + 1"/> - <xsl:with-param name="expandedRowCount" select="$expandedRowCount"/> - <xsl:with-param name="expandedRowCountIndex"> - <xsl:choose> - <xsl:when test="@ss:Index and @ss:Span"> - <xsl:value-of select="@ss:Index + @ss:Span + 1"/> - </xsl:when> - <xsl:when test="@ss:Index"> - <xsl:value-of select="@ss:Index + 1"/> - </xsl:when> - <xsl:when test="@ss:Span"> - <xsl:value-of select="$expandedRowCountIndex + @ss:Span + 1"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="$expandedRowCountIndex + 1"/> - </xsl:otherwise> - </xsl:choose> - </xsl:with-param> - <xsl:with-param name="expandedColumnCount" select="$expandedColumnCount"/> - <xsl:with-param name="condition-pos-str" select="$condition-pos-str"/> - </xsl:apply-templates> - </xsl:when> - <xsl:when test="$currentRowNo < 65536"> - <xsl:element name="table:table-row"> - <!-- fill the preceding gap with rows without a cell --> - <xsl:attribute name="table:number-rows-repeated"> - <xsl:value-of select="65536 - $currentRowNo"/> - </xsl:attribute> - <xsl:choose> - <xsl:when test="$expandedColumnCount != 0"> - <table:table-cell table:number-columns-repeated="{$expandedColumnCount}"/> - </xsl:when> - <xsl:otherwise> - <!-- OASIS XML row can not be empty --> - <table:table-cell table:number-columns-repeated="256"/> - </xsl:otherwise> - </xsl:choose> - </xsl:element> - </xsl:when> - </xsl:choose> + </xsl:template> + <xsl:template name="get-expanded-column-count"> <xsl:choose> <xsl:when test="ss:Table/@ss:ExpandedColumnCount"> commit 8fdef3e8d8ead3903795df87cbf66256691542b1 Author: Peter Jentsch <pj...@guineapics.de> Date: Tue May 1 00:16:34 2012 +0200 optimized handling of ConditionalFormatting elements Removed ill-performing key definitions. Also fixes bug with bogus expression quoting within formatting conditions. Change-Id: Iab9b26f30ac7f780acb8a4e1397aaf2f4fa490f4 diff --git a/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl b/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl index 71f1baa..cd223f8 100644 --- a/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl +++ b/filter/source/xslt/import/spreadsheetml/spreadsheetml2ooo.xsl @@ -764,117 +764,122 @@ </xsl:otherwise> </xsl:choose> </xsl:template> - <xsl:key match="/ss:Workbook/ss:Worksheet/ss:Table" name="tableWithConditional" use="following-sibling::x:ConditionalFormatting"/> - <xsl:key match="ss:Table/ss:Row/ss:Cell/@ss:StyleID" name="tableStyleIDs" use="ancestor::ss:Table"/> + + <xsl:key name="definedStyleIds" match="/ss:Workbook/ss:Styles/ss:Style/@ss:ID" use="string(.)"/> + <xsl:variable name="defaultStyle" select="/ss:Workbook/ss:Styles/ss:Style[@ss:ID='Default']/@ss:ID"></xsl:variable> <xsl:key name="styleId" match="@ss:StyleID" use="."/> <xsl:template name="CondFormat_automatic_style"> <!-- For each conditionalFormatting We inject a new style, which is a child of the current found style --> - <xsl:for-each select="/ss:Workbook/ss:Worksheet/x:ConditionalFormatting"> - <xsl:variable name="table-pos" select="count(../preceding-sibling::ss:Worksheet)+1"/> - <xsl:variable name="conditions" select="count(preceding-sibling::x:ConditionalFormatting)+1"/> - <xsl:variable name="conditionalFormatting" select="."/> - <!-- for all 'ssStyle/@ss:ID's, which are in tables connected within this conditional formatting --> - <xsl:for-each select="key('tableStyleIDs', key('tableWithConditional', .)) [generate-id(.) = generate-id(key('styleId', .)[1])] "> - <!-- sort the style ID by their naming --> - <xsl:sort select="."/> - <xsl:element name="style:style"> - <xsl:attribute name="style:name"> - <xsl:call-template name="encode-as-nc-name"> - <xsl:with-param name="string" select="concat(.,'-ce',$table-pos,'-',$conditions)"/> - </xsl:call-template> - </xsl:attribute> - <xsl:attribute name="style:family">table-cell</xsl:attribute> - <xsl:variable name="style" select="key('Style', .)" /> - <xsl:choose> - <xsl:when test="$style/@ss:Name"> - <xsl:attribute name="style:parent-style-name"> - <xsl:call-template name="encode-as-nc-name"> - <xsl:with-param name="string" select="."/> + <xsl:for-each select="/ss:Workbook/ss:Worksheet[x:ConditionalFormatting]"> + <xsl:variable name="table-pos" select="count(preceding-sibling::ss:Worksheet)+1"/> + <xsl:variable name="styleIdsUsedByTable" select="$defaultStyle | key('definedStyleIds', ss:Table/ss:Row/ss:Cell/@ss:StyleID)"/> + <xsl:for-each select="x:ConditionalFormatting"> + <xsl:variable name="conditions" select="position()"/> + <xsl:variable name="conditionalFormatting" select="."/> + <!-- we want to loop over the distinct styleId attribute values of all cells within the table related to the current conditional formatting. --> + <!-- We'd need to add the anonymous style id "Default" to the mix. --> + <!-- for all 'ssStyle/@ss:ID's, which are in tables connected within this conditional formatting --> + <!-- <xsl:for-each select="key('tableStyleIDs', generate-id(preceding-sibling::ss:Table)) [generate-id(.) = generate-id(key('styleId', .)[1])] "> --> + <xsl:for-each select="$styleIdsUsedByTable"> + <xsl:element name="style:style"> + <xsl:attribute name="style:name"> + <xsl:call-template name="encode-as-nc-name"> + <xsl:with-param name="string" select="concat(.,'-ce',$table-pos,'-',$conditions)"/> + </xsl:call-template> + </xsl:attribute> + <xsl:attribute name="style:family">table-cell</xsl:attribute> + <xsl:variable name="style" select="key('Style', .)" /> + <xsl:choose> + <xsl:when test="$style/@ss:Name"> + <xsl:attribute name="style:parent-style-name"> + <xsl:call-template name="encode-as-nc-name"> + <xsl:with-param name="string" select="."/> + </xsl:call-template> + </xsl:attribute> + </xsl:when> + <!-- as we create an automatic style, the parent is not allowed to be an automatic style as well + if the parent would be a automatic (unnamed) style, the style information have to be embedded to this style --> + <xsl:otherwise> + <xsl:attribute name="style:parent-style-name"> + <xsl:call-template name="encode-as-nc-name"> + <xsl:with-param name="string" select="$style/@ss:Parent"/> + </xsl:call-template> + </xsl:attribute> + <xsl:if test="$style/ss:NumberFormat/@ss:Format"> + <xsl:attribute name="style:data-style-name"> + <xsl:value-of select="concat($style/@ss:ID, 'F')"/> + </xsl:attribute> + </xsl:if> + <xsl:apply-templates select="$style" mode="style-style-content"/> + </xsl:otherwise> + </xsl:choose> + <xsl:for-each select="$conditionalFormatting/x:Condition"> + <xsl:variable name="condition-number" select="count(preceding-sibling::x:Condition)+1"/> + <xsl:variable name="base-address"> + <xsl:choose> + <xsl:when test="contains(../x:Range,',')"> + <xsl:choose> + <xsl:when test="contains(substring-before(../x:Range,','),':')"> + <xsl:value-of select="substring-before(substring-after(../x:Range,':'),',')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="substring-before(../x:Range,',')"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="../x:Range"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="columnNumber"> + <xsl:choose> + <xsl:when test="contains($base-address, ':')"> + <xsl:value-of select="substring-after(substring-after($base-address, ':'),'C')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="substring-after($base-address,'C')"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="rowNumber"> + <xsl:choose> + <xsl:when test="contains($base-address, ':')"> + <xsl:value-of select="substring-before(substring-after(substring-after($base-address, ':'),'R'),'C')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="substring-before(substring-after($base-address,'R'),'C')"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="base-cell-address"> + <xsl:call-template name="translate-unit"> + <xsl:with-param name="column-number" select="$columnNumber"/> + <xsl:with-param name="row-number" select="$rowNumber"/> + <xsl:with-param name="column-pos-style" select="'relative'"/> + <xsl:with-param name="row-pos-style" select="'relative'"/> </xsl:call-template> - </xsl:attribute> - </xsl:when> - <!-- as we create an automatic style, the parent is not allowed to be an automatic style as well - if the parent would be a automatic (unnamed) style, the style information have to be embedded to this style --> - <xsl:otherwise> - <xsl:attribute name="style:parent-style-name"> - <xsl:call-template name="encode-as-nc-name"> - <xsl:with-param name="string" select="$style/@ss:Parent"/> + </xsl:variable> + <xsl:variable name="condition-value"> + <xsl:call-template name="translate-condition"> + <xsl:with-param name="cell-column-pos" select="$columnNumber"/> + <xsl:with-param name="cell-row-pos" select="$rowNumber"/> </xsl:call-template> - </xsl:attribute> - <xsl:if test="$style/ss:NumberFormat/@ss:Format"> - <xsl:attribute name="style:data-style-name"> - <xsl:value-of select="concat($style/@ss:ID, 'F')"/> + </xsl:variable> + <xsl:element name="style:map"> + <xsl:attribute name="style:condition"> + <xsl:value-of select="$condition-value"/> </xsl:attribute> - </xsl:if> - <xsl:apply-templates select="$style" mode="style-style-content"/> - </xsl:otherwise> - </xsl:choose> - <xsl:for-each select="$conditionalFormatting/x:Condition"> - <xsl:variable name="condition-number" select="count(preceding-sibling::x:Condition)+1"/> - <xsl:variable name="base-address"> - <xsl:choose> - <xsl:when test="contains(../x:Range,',')"> - <xsl:choose> - <xsl:when test="contains(substring-before(../x:Range,','),':')"> - <xsl:value-of select="substring-before(substring-after(../x:Range,':'),',')"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="substring-before(../x:Range,',')"/> - </xsl:otherwise> - </xsl:choose> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="../x:Range"/> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="columnNumber"> - <xsl:choose> - <xsl:when test="contains($base-address, ':')"> - <xsl:value-of select="substring-after(substring-after($base-address, ':'),'C')"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="substring-after($base-address,'C')"/> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="rowNumber"> - <xsl:choose> - <xsl:when test="contains($base-address, ':')"> - <xsl:value-of select="substring-before(substring-after(substring-after($base-address, ':'),'R'),'C')"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="substring-before(substring-after($base-address,'R'),'C')"/> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="base-cell-address"> - <xsl:call-template name="translate-unit"> - <xsl:with-param name="column-number" select="$columnNumber"/> - <xsl:with-param name="row-number" select="$rowNumber"/> - <xsl:with-param name="column-pos-style" select="'relative'"/> - <xsl:with-param name="row-pos-style" select="'relative'"/> - </xsl:call-template> - </xsl:variable> - <xsl:variable name="condition-value"> - <xsl:call-template name="translate-condition"> - <xsl:with-param name="cell-column-pos" select="$columnNumber"/> - <xsl:with-param name="cell-row-pos" select="$rowNumber"/> - </xsl:call-template> - </xsl:variable> - <xsl:element name="style:map"> - <xsl:attribute name="style:condition"> - <xsl:value-of select="$condition-value"/> - </xsl:attribute> - <xsl:attribute name="style:apply-style-name"> - <xsl:value-of select="concat('Excel_CondFormat_',$table-pos,'_',$conditions,'_',$condition-number)"/> - </xsl:attribute> - <xsl:attribute name="style:base-cell-address"> - <xsl:value-of select="concat(../../@ss:Name,'.',$base-cell-address)"/> - </xsl:attribute> - </xsl:element> - </xsl:for-each> - </xsl:element> + <xsl:attribute name="style:apply-style-name"> + <xsl:value-of select="concat('Excel_CondFormat_',$table-pos,'_',$conditions,'_',$condition-number)"/> + </xsl:attribute> + <xsl:attribute name="style:base-cell-address"> + <xsl:value-of select="concat(../../@ss:Name,'.',$base-cell-address)"/> + </xsl:attribute> + </xsl:element> + </xsl:for-each> + </xsl:element> + </xsl:for-each> </xsl:for-each> </xsl:for-each> </xsl:template> @@ -895,31 +900,6 @@ <xsl:variable name="qualifier" select="x:Qualifier"/> <xsl:variable name="first-value" select="x:Value1"/> <xsl:choose> - <xsl:when test="$qualifier = 'Equal'"> - <xsl:choose> - <xsl:when test="starts-with($first-value,'"')"> - <xsl:value-of select="concat('cell-content()=',$address-value)"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="concat('cell-content()=[',$address-value,']')"/> - </xsl:otherwise> - </xsl:choose> - </xsl:when> - <xsl:when test="$qualifier = 'Less'"> - <xsl:value-of select="concat('cell-content()<[',$address-value,']')"/> - </xsl:when> - <xsl:when test="$qualifier = 'Greater'"> - <xsl:value-of select="concat('cell-content()>[',$address-value,']')"/> - </xsl:when> - <xsl:when test="$qualifier = 'LessOrEqual'"> - <xsl:value-of select="concat('cell-content()<=[',$address-value,']')"/> - </xsl:when> - <xsl:when test="$qualifier = 'GreaterOrEqual'"> - <xsl:value-of select="concat('cell-content()>=[',$address-value,']')"/> - </xsl:when> - <xsl:when test="$qualifier = 'NotEqual'"> - <xsl:value-of select="concat('cell-content()!=[',$address-value,']')"/> - </xsl:when> <xsl:when test="$qualifier = 'Between'"> <xsl:variable name="second-value"> <xsl:call-template name="translate-expression"> @@ -929,7 +909,7 @@ <xsl:with-param name="return-value" select="''"/> </xsl:call-template> </xsl:variable> - <xsl:value-of select="concat('cell-content-is-between([',$address-value,'],[',$second-value,'])')"/> + <xsl:value-of select="concat('cell-content-is-between(',$address-value,',',$second-value,')')"/> </xsl:when> <xsl:when test="$qualifier = 'NotBetween'"> <xsl:variable name="second-value"> @@ -940,8 +920,22 @@ <xsl:with-param name="return-value" select="''"/> </xsl:call-template> </xsl:variable> - <xsl:value-of select="concat('cell-content-is-not-between([',$address-value,'],[',$second-value,'])')"/> + <xsl:value-of select="concat('cell-content-is-not-between(',$address-value,',',$second-value,')')"/> </xsl:when> + <xsl:otherwise> + <xsl:variable name="translatedQualifier"> + <xsl:choose> + <xsl:when test="$qualifier = 'Equal'">=</xsl:when> + <xsl:when test="$qualifier = 'Less'"><</xsl:when> + <xsl:when test="$qualifier = 'Greater'">></xsl:when> + <xsl:when test="$qualifier = 'LessOrEqual'"><=</xsl:when> + <xsl:when test="$qualifier = 'GreaterOrEqual'">>=</xsl:when> + <xsl:when test="$qualifier = 'NotEqual'">!=</xsl:when> + </xsl:choose> + </xsl:variable> + <xsl:value-of select="concat('cell-content()', $translatedQualifier, $address-value)"/> + </xsl:otherwise> + </xsl:choose> </xsl:when> <xsl:otherwise> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits