2019-04-15 10:23:03 +08:00
< ? xml version = " 1.0 " encoding = " UTF-8 " ? >
< ! - -
2021-06-23 10:26:22 +08:00
* This file is part of the LibreOffice project .
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2 . 0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice :
*
* 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 .
- - >
< ! - -
For further documentation and updates visit http : //xml.openoffice.org/odf2xhtml
2019-04-15 10:23:03 +08:00
- - >
2021-06-23 10:26:22 +08:00
< 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 : xforms = " http://www.w3.org/2002/xforms " xmlns : xlink = " http://www.w3.org/1999/xlink " xmlns : xsd = " http://www.w3.org/2001/XMLSchema " xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance " xmlns : xt = " http://www.jclark.com/xt " xmlns : common = " http://exslt.org/common " xmlns : xalan = " http://xml.apache.org/xalan " xmlns : loext = " urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0 " exclude - result - prefixes = " chart config dc dom dr3d draw fo form math meta number office ooo oooc ooow script style svg table text xforms xlink xsd xsi xt common xalan " xmlns = " http://www.w3.org/1999/xhtml " >
< ! - - + + + + + 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 " / >
< ! - - common office body element handling - - >
< xsl : import href = " ../common/body.xsl " / >
< ! - - common table handling - - >
< xsl : import href = " ../common/table/table.xsl " / >
< ! - - xhtml table handling - - >
< xsl : include href = " table.xsl " / >
< ! - - Useful in case of ' style : map ' , conditional formatting , where a style references to another - - >
< xsl : key name = " styles " match = " /*/office:styles/style:style | /*/office:automatic-styles/style:style " use = " @style:name " / >
< ! - - * * * * * * * * * * * * - - >
< ! - - * * * body * * * - - >
< ! - - * * * * * * * * * * * * - - >
< xsl : key match = " style:style/@style:master-page-name " name = " masterPage " use = " 'count' " / >
< xsl : key match = " style:master-page " name = " masterPageElements " use = " @style:name " / >
< xsl : key match = " style:page-layout " name = " pageLayoutElements " use = " @style:name " / >
< xsl : key name = " writingModeStyles " match = " /*/office:styles/style:style/style:paragraph-properties/@style:writing-mode | /*/office:automatic-styles/style:style/style:paragraph-properties/@style:writing-mode " use = " 'test' " / >
< xsl : template name = " create-body " >
< xsl : param name = " globalData " / >
< xsl : call - template name = " create-body.collect-page-properties " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : template >
< xsl : template name = " create-body.collect-page-properties " >
< xsl : param name = " globalData " / >
< ! - - approximation to find the correct master page style ( with page dimensions ) - - >
< xsl : variable name = " masterPageNames " >
< ! - - Loop over every style : style containing a @style : master - page - name attribute - - >
< xsl : for - each select = " key('masterPage','count') " >
< ! - - Check if this style is being used in the body - - >
< xsl : if test = " key('elementUsingStyle', ../@style:name) " >
< ! - - Check every master - page - name if it is not empty and return as ';' separated list - - >
< xsl : if test = " string-length(../@style:master-page-name) > 0 " >
< xsl : value - of select = " ../@style:master-page-name " / > ;
< / xsl : if >
< / xsl : if >
< / xsl : for - each >
< / xsl : variable >
< ! - - Take the first of the masterpage list and get the according style : master - page element and find the @style : page - layout - name - - >
< xsl : variable name = " pageLayoutName " select = " key('masterPageElements', substring-before($masterPageNames,';'))/@style:page-layout-name " / >
< xsl : variable name = " pagePropertiesRTF " >
< xsl : choose >
< xsl : when test = " not($pageLayoutName) or $pageLayoutName = '' " >
< xsl : copy - of select = " $globalData/styles-file/*/office:automatic-styles/style:page-layout[1]/style:page-layout-properties " / >
< / xsl : when >
< xsl : otherwise >
< ! - - Find the according style : page - layout and store the properties in a variable - - >
< xsl : copy - of select = " key('pageLayoutElements', $pageLayoutName)/style:page-layout-properties " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : choose >
< xsl : when test = " function-available('common:node-set') " >
< xsl : call - template name = " create-body.create " >
< xsl : with - param name = " globalData " select = " common:node-set($globalData) " / >
< xsl : with - param name = " pageProperties " select = " common:node-set($pagePropertiesRTF) " / >
< / xsl : call - template >
< / xsl : when >
< xsl : when test = " function-available('xalan:nodeset') " >
< xsl : call - template name = " create-body.create " >
< xsl : with - param name = " globalData " select = " xalan:nodeset($globalData) " / >
< xsl : with - param name = " pageProperties " select = " xalan:nodeset($pagePropertiesRTF) " / >
< / xsl : call - template >
< / xsl : when >
< xsl : when test = " function-available('xt:node-set') " >
< xsl : call - template name = " create-body.create " >
< xsl : with - param name = " globalData " select = " xt:node-set($globalData) " / >
< xsl : with - param name = " pageProperties " select = " xt:node-set($pagePropertiesRTF) " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : message terminate = " yes " > The required node - set function was not found ! < / xsl : message >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template name = " create-body.create " >
< xsl : param name = " globalData " / >
< xsl : param name = " pageProperties " / >
< xsl : element name = " body " >
< ! - - direction of text flow - - >
< xsl : variable name = " writingMode " select = " $pageProperties/style:page-layout-properties/@style:writing-mode " / >
< xsl : choose >
< xsl : when test = " $writingMode " >
< xsl : choose >
< xsl : when test = " contains($writingMode, 'lr') " >
< xsl : attribute name = " dir " > ltr < / xsl : attribute >
< / xsl : when >
< xsl : when test = " contains($writingMode, 'rl') " >
< xsl : attribute name = " dir " > rtl < / xsl : attribute >
< / xsl : when >
< / xsl : choose >
< / xsl : when >
< xsl : otherwise >
< ! - - As CSS writing - mode is not implemented by all browsers , a heuristic is done - - >
< xsl : variable name = " writingModeTest " select = " key('writingModeStyles', 'test') " / >
< xsl : if test = " contains($writingModeTest, 'rl') " >
< xsl : attribute name = " dir " > rtl < / xsl : attribute >
< / xsl : if >
< / xsl : otherwise >
< / xsl : choose >
< ! - - adapt page size - - >
< xsl : variable name = " pageWidth " select = " $pageProperties/style:page-layout-properties/@fo:page-width " / >
< ! - - multiple backgroundimages for different page styles ( never used in html ) - - >
< xsl : variable name = " backgroundImage " select = " $pageProperties/style:page-layout-properties/style:background-image " / >
< ! - - page margins & background image - - >
< xsl : if test = " $pageWidth or $pageProperties/style:page-layout-properties/@fo:* or $backgroundImage/@xlink:href " >
< xsl : attribute name = " style " >
< xsl : if test = " $pageWidth " >
< xsl : text > max - width : < / xsl : text >
< xsl : value - of select = " $pageWidth " / >
< xsl : text > ; < / xsl : text >
< / xsl : if >
< xsl : if test = " $pageProperties/style:page-layout-properties/@fo:* or $backgroundImage/@xlink:href " >
< xsl : apply - templates select = " $pageProperties/style:page-layout-properties/@fo:* " / >
< xsl : if test = " $backgroundImage/@xlink:href " >
< xsl : text > background - image : url ( < / xsl : text >
< xsl : call - template name = " create-href " >
< xsl : with - param name = " href " select = " $backgroundImage/@xlink:href " / >
< / xsl : call - template >
< xsl : text > ) ; < / xsl : text >
< xsl : if test = " $backgroundImage/@style:repeat " >
< xsl : choose >
< xsl : when test = " $backgroundImage/@style:repeat = 'no-repeat' " >
< xsl : text > background - repeat : no - repeat ; < / xsl : text >
< / xsl : when >
< xsl : otherwise >
< xsl : text > background - repeat : repeat ; < / xsl : text >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : if >
< xsl : if test = " $backgroundImage/@style:position " >
< xsl : text > background - position : < / xsl : text >
< xsl : value - of select = " $backgroundImage/@style:position " / >
< xsl : text > ; < / xsl : text >
< / xsl : if >
< / xsl : if >
< / xsl : if >
< / xsl : attribute >
< / xsl : if >
< ! - - processing the content of the OpenDocument content file - - >
< xsl : apply - templates select = " /*/office:body/* " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : element >
< / xsl : template >
< ! - - processing the content of the OpenDocument content file - - >
< xsl : template match = " office:body/* " >
< xsl : param name = " globalData " / >
< ! - - not using of ' apply - styles - and - content ' as the content table information might have been added to ' globalData ' variable - - >
< xsl : apply - templates select = " @text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name " > < ! - - | @presentation : style - name - - >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< ! - - writing the footer - and endnotes beyond the body - - >
< xsl : call - template name = " write-text-nodes " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - - >
< ! - - * * * User Field Declarations * * * - - >
< ! - - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - - >
< xsl : template match = " text:user-field-get | text:user-field-input " >
< xsl : param name = " globalData " / >
< xsl : value - of select = " . " / >
< / xsl : template >
< xsl : template match = " text:conditional-text " >
< xsl : param name = " globalData " / >
< xsl : value - of select = " . " / >
< / xsl : template >
< ! - - ODF text fields - - >
< xsl : template match = " text:author-initials | text:author-name | text:chapter | text:character-count | text:creation-date | text:creation-time | text:creator | text:date | text:description | text:editing-cycles | text:editing-duration | text:file-name | text:image-count | text:initial-creator | text:keywords | text:modification-date | text:modification-time | text:object-count | text:page-continuation | text:page-count | text:page-number | text:paragraph-count | text:print-date | text:print-time | text:printed-by | text:sender-city | text:sender-company | text:sender-country | text:sender-email | text:sender-fax | text:sender-firstname | text:sender-initials | text:sender-lastname | text:sender-phone-private | text:sender-phone-work | text:sender-position | text:sender-postal-code | text:sender-state-or-province | text:sender-street | text:sender-title | text:sheet-name | text:subject | text:table-count | text:time | text:title | text:user-defined | text:word-count " >
< xsl : param name = " globalData " / >
< xsl : element name = " span " >
< xsl : attribute name = " title " >
< xsl : value - of select = " local-name() " / >
< / xsl : attribute >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : element >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * - - >
< ! - - * * * Textbox * * * - - >
< ! - - * * * * * * * * * * * * * * * - - >
< xsl : template match = " draw:text-box " >
< xsl : param name = " globalData " / >
< xsl : comment > Next ' div ' was a ' draw : text - box ' . < / xsl : comment >
< xsl : element name = " div " >
< xsl : variable name = " dimension " >
< xsl : apply - templates select = " @fo:min-width " / >
< xsl : apply - templates select = " @fo:max-width " / >
< xsl : apply - templates select = " @fo:min-height " / >
< xsl : apply - templates select = " @fo:max-height " / >
< / xsl : variable >
< xsl : if test = " $dimension " >
< xsl : attribute name = " style " >
< xsl : value - of select = " $dimension " / >
< / xsl : attribute >
< / xsl : if >
< xsl : apply - templates select = " @draw:name " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< xsl : apply - templates select = " node() " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : element >
< / xsl : template >
< xsl : template match = " @fo:min-width " >
< xsl : text > min - width : < / xsl : text >
< xsl : value - of select = " . " / >
< xsl : text > ; < / xsl : text >
< / xsl : template >
< xsl : template match = " @fo:max-width " >
< xsl : text > max - width : < / xsl : text >
< xsl : value - of select = " . " / >
< xsl : text > ; < / xsl : text >
< / xsl : template >
< xsl : template match = " @fo:min-height " >
< xsl : text > min - height : < / xsl : text >
< xsl : value - of select = " . " / >
< xsl : text > ; < / xsl : text >
< / xsl : template >
< xsl : template match = " @fo:max-height " >
< xsl : text > max - height : < / xsl : text >
< xsl : value - of select = " . " / >
< xsl : text > ; < / xsl : text >
< / xsl : template >
< ! - - inline style helper for the ' div ' boxes - - >
< xsl : template name = " svg:height " >
< xsl : text > height : < / xsl : text >
< xsl : choose >
< ! - - changing the distance measure : inch to in - - >
< xsl : when test = " contains(@svg:height, 'inch') " >
< xsl : value - of select = " substring-before(@svg:height, 'ch') " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " @svg:height " / >
< / xsl : otherwise >
< / xsl : choose >
< xsl : text > ; < / xsl : text >
< / xsl : template >
< ! - - inline style helper for the ' div ' boxes - - >
< xsl : template name = " svg:width " >
< xsl : text > width : < / xsl : text >
< xsl : choose >
< ! - - changing the distance measure : inch to in - - >
< xsl : when test = " contains(@svg:width, 'inch') " >
< xsl : value - of select = " substring-before(@svg:width, 'ch') " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " @svg:width " / >
< / xsl : otherwise >
< / xsl : choose >
< xsl : text > ; < / xsl : text >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * * * - - >
< ! - - * * * Paragraphs * * * - - >
< ! - - * * * * * * * * * * * * * * * * * * - - >
< xsl : template match = " text:p | draw:page " >
< xsl : param name = " globalData " / >
< ! - - The footnote symbol is the prefix for a footnote in the footer - - >
< xsl : param name = " footnotePrefix " / >
< ! - - 1 ) In ODF sometimes the following children are nested
< text : p >
< draw : frame >
< draw : text - box >
< text : p >
Which results in a paragraphs ( the last text : p ) having a paragraph as its ancestor .
In HTML a 'p' can only have inline documents ( no other 'p' as children ' ) ,
a ' div ' will be given for the ancestors instead .
2 ) ODF images are embedded in a paragraph , but CSS is not able to express a horizontal alignment for an HTML image ( text : align is only valid for block elements ) .
A surrounding ' div ' element taking over the image style solves that problem , but the div is invalid as child of a paragraph
Therefore the paragraph has to be exchanged with a HTML div element
- - >
< ! - - 2DO page alignment fix - PART1 - - >
< xsl : variable name = " childText " > < xsl : apply - templates mode = " getAllTextChildren " / > < / xsl : variable >
< xsl : choose >
< xsl : when test = " name() = 'text:p' and not(*) and (normalize-space($childText) = '') " >
< ! - - WorkAround : Test if the empty paragraph was added after an image , which OOO often does - - >
< xsl : variable name = " isFollowingImage " >
< xsl : call - template name = " follows-empty-paragraphs-and-image " >
< xsl : with - param name = " precedingElement " select = " preceding-sibling::node()[1] " / >
< / xsl : call - template >
< / xsl : variable >
< xsl : if test = " $isFollowingImage = 'no' " >
< xsl : call - template name = " create-paragraph " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnotePrefix " select = " $footnotePrefix " / >
< / xsl : call - template >
< / xsl : if >
< / xsl : when >
< xsl : when test = " draw:frame and ((normalize-space($childText) != '') or (((count(*) - count(text:soft-page-break)) > 1))) " >
< ! - - If there is a ' draw : frame ' child with text ( not being whitespace alone ) and more than the draw : frame alone and
not the draw : frame and a soft - page - break alone ( which is quite often ) - - >
< ! - - If there is a frame within the text : p or draw : page , its siblings are surrounded as well by a div and are floating ( CSS float ) - - >
< ! - - But it makes no sense to create floating if the frame is alone or only together with a soft - page - break not usable for HTML - - >
< ! - - The paragraph is written as DIV as there might be nested paragraphs ( see above choose block ) - - >
< xsl : choose >
< xsl : when test = " name() = 'text:p' " >
< xsl : comment > Next ' div ' was a ' text : p ' . < / xsl : comment >
< / xsl : when >
< xsl : otherwise >
< xsl : comment > Next ' div ' was a ' draw : page ' . < / xsl : comment >
< / xsl : otherwise >
< / xsl : choose >
< xsl : element name = " div " >
< xsl : apply - templates select = " @* " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< ! - - the footnote symbol is the prefix for a footnote in the footer - - >
< xsl : copy - of select = " $footnotePrefix " / >
< ! - - start floating of frame ( and siblings ) - - >
< xsl : apply - templates select = " node()[1] " mode = " frameFloating " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " 0 " / >
< xsl : with - param name = " previousFrameHeights " select = " 0 " / >
< ! - - 2DO for me ( Svante ) - Not used , uncertain 4now . . .
< xsl : with - param name = " pageMarginLeft " >
< xsl : call - template name = " getPageMarginLeft " / >
< / xsl : with - param > - - >
< / xsl : apply - templates >
< / xsl : element >
< ! - - after the last draw : frame sibling the CSS float is disabled
& # 160 ; is an unbreakable whitespace to give content to the element and force a browser not to ignore the element - - >
< div style = " clear:both; line-height:0; width:0; height:0; margin:0; padding:0; " > & # 160 ; < / div >
< / xsl : when >
< xsl : when test = " text:tab and not(ancestor::text:index-body) " >
< ! - - If there is a tabulator ( ie . text : tab ) within a paragraph , a heuristic for ODF tabulators creates a
span for every text : tab embracing the following text nodes aligning them according to the tabulator .
A line break or another text : tab starts a new text : span , line break even the tab counter for the line .
- - >
< xsl : element name = " p " >
< xsl : apply - templates select = " @* " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< ! - - start with first child of the paragraph - - >
< xsl : variable name = " firstChildNode " select = " node()[1] " / >
< xsl : apply - templates select = " $firstChildNode " mode = " tabHandling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " tabStops " select = " $globalData/all-doc-styles/style[@style:name = current()/@text:style-name]/*/style:tab-stops " / >
< xsl : with - param name = " parentMarginLeft " >
< ! - - Styles of first paragraph in list item , including ancestor styles ( inheritance ) - - >
< xsl : variable name = " paragraphName " select = " @text:style-name " / >
< xsl : variable name = " imageParagraphStyle " select = " $globalData/all-styles/style[@style:name = $paragraphName]/final-properties " / >
< ! - - Only the left margin of the first paragraph of a list item will be added to the margin of the complete list ( all levels ) - - >
2019-04-15 10:23:03 +08:00
< ! - - 2DO : left - margin in order with bidirectional - - >
2021-06-23 10:26:22 +08:00
< xsl : choose >
< xsl : when test = " contains($imageParagraphStyle, 'margin-left:') " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " normalize-space(substring-before(substring-after($imageParagraphStyle, 'margin-left:'), ';')) " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< xsl : with - param name = " pageMarginLeft " >
< xsl : call - template name = " getPageMarginLeft " / >
< / xsl : with - param >
< / xsl : apply - templates >
< / xsl : element >
< / xsl : when >
< xsl : when test = " text:tab and text:a and ancestor::text:index-body " >
< xsl : element name = " p " >
< xsl : apply - templates select = " attribute::* | child::text:a " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : element >
< / xsl : when >
< xsl : otherwise >
< xsl : choose >
< ! - - ! ! Check if paragraph is empty ! !
OOo writes out empty paragraphs layouted behind an image ( = draw : image within draw : frame )
those have to be neglected in HTML - - >
< xsl : when test = " name() = 'text:p' and not($childText) and not(*) " >
< xsl : variable name = " isFollowingImage " >
< xsl : call - template name = " follows-empty-paragraphs-and-image " >
< xsl : with - param name = " precedingElement " select = " preceding-sibling::node()[1] " / >
< / xsl : call - template >
< / xsl : variable >
< xsl : if test = " $isFollowingImage = 'no' " >
< xsl : call - template name = " create-paragraph " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnotePrefix " select = " $footnotePrefix " / >
< / xsl : call - template >
< / xsl : if >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " create-paragraph " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnotePrefix " select = " $footnotePrefix " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - - Return the text - - >
< xsl : template match = " text() " mode = " getAllTextChildren " >
< xsl : value - of select = " . " / >
< / xsl : template >
< ! - - A span will be created for every text : tab embracing the following text nodes .
A line break or another text : tab starts a new text : span - - >
< xsl : template match = " * | text() " mode = " tabHandling " >
< xsl : param name = " globalData " / >
< xsl : param name = " tabStops " / >
< ! - - there can be multiple tabs in one line , tabNo guesses the one to apply . By default the first i . e . " 1 " - - >
< xsl : param name = " tabCount " select = " 0 " / >
< xsl : param name = " parentMarginLeft " / >
< xsl : param name = " pageMarginLeft " / >
< ! - - 2DO : EXCHANGE FOLLOWING SIBLING BY VARIABLE - - >
< xsl : variable name = " followingSiblingNode " select = " following-sibling::node()[1] " / >
< ! - -
Every tabulator indents its following content , encapuslated in a span
element .
This template have two modes :
1 ) Before the first tabulator it will match as usually paragraph content
to HTML .
2 ) After the first paragraph it will always triggers two recursions .
One embraces the following content of a paragraph element into a span .
( tabContentHandling )
The other calls this template and will now ignore anything else than
TAB and LINE - BREAK .
The tabulators and linebreaks are being iterated , one by one to keep track of the tab number
- - >
< xsl : choose >
< xsl : when test = " name() = 'text:tab' " >
< ! - - every frame sibling have to be incapuslated within a div with left indent - - >
< xsl : element name = " span " >
< xsl : choose >
< xsl : when test = " count($tabStops/style:tab-stop) > 0 and count($tabStops/style:tab-stop) < 3 " >
< ! - - only allow the heuristic when the style has less than 3 TABS - - >
< ! - - ignore heuristics if no TABS are defined - - >
< xsl : attribute name = " style " >
< xsl : call - template name = " createTabIndent " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " tabStops " select = " $tabStops " / >
< xsl : with - param name = " tabCount " select = " $tabCount + 1 " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< xsl : with - param name = " pageMarginLeft " select = " $pageMarginLeft " / >
< / xsl : call - template >
< / xsl : attribute >
< / xsl : when >
< xsl : otherwise >
< ! - - if there are more than 3 TABS in the style , create a none - breakable - space as whitespace - - >
< xsl : text > & # 160 ; < / xsl : text >
< / xsl : otherwise >
< / xsl : choose >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " tabContentHandling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : element >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " tabHandling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " tabStops " select = " $tabStops " / >
< xsl : with - param name = " tabCount " select = " $tabCount + 1 " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< xsl : with - param name = " pageMarginLeft " select = " $pageMarginLeft " / >
< / xsl : apply - templates >
< / xsl : when >
< xsl : when test = " name() = 'text:line-break' " >
< ! - - A line - break resets the tabCount to '0' - - >
< br / >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " tabHandling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " tabStops " select = " $tabStops " / >
< xsl : with - param name = " tabCount " select = " 0 " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< xsl : with - param name = " pageMarginLeft " select = " $pageMarginLeft " / >
< / xsl : apply - templates >
< / xsl : when >
< xsl : otherwise >
< ! - - only before the first tab all content is written out - - >
< xsl : if test = " $tabCount = 0 " >
< xsl : apply - templates select = " . " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : if >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " tabHandling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " tabStops " select = " $tabStops " / >
< xsl : with - param name = " tabCount " select = " $tabCount " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< xsl : with - param name = " pageMarginLeft " select = " $pageMarginLeft " / >
< / xsl : apply - templates >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - -
This recursion creates the content of a tab ( i . e . following siblings
till next TAB or LINE BREAK ) and ends with the next
TAB , LINE - BREAK or with the end of the paragraph .
- - >
< xsl : template match = " * | text() " mode = " tabContentHandling " >
< xsl : param name = " globalData " / >
< xsl : if test = " (name() != 'text:tab') and (name() != 'text:line-break') " >
< ! - - Write out content - - >
< xsl : apply - templates select = " . " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< ! - - Apply for the next node - - >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " tabContentHandling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : if >
< / xsl : template >
< xsl : template name = " createTabIndent " >
< xsl : param name = " globalData " / >
< xsl : param name = " tabStops " / >
< xsl : param name = " tabCount " / >
< xsl : param name = " parentMarginLeft " / >
< xsl : param name = " pageMarginLeft " / >
< xsl : text > position : absolute ; left : < / xsl : text >
< xsl : variable name = " tabPosition " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " $tabStops/style:tab-stop[$tabCount]/@style:position " / >
< / xsl : call - template >
< / xsl : variable >
< xsl : variable name = " tabIndent " >
< xsl : choose >
< xsl : when test = " $tabStops/style:tab-stop[$tabCount]/@style:type = 'center' " >
< ! - - in case of style : type ' center ' the text is even before the tab stop ,
centered around the beginning . As I see currently no way in mapping this ,
therefore I do some HEURISTIC ( minus - 2 . 5cm ) - - >
< xsl : value - of select = " $tabPosition + $parentMarginLeft + $pageMarginLeft - 2.5 " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $tabPosition + $parentMarginLeft + $pageMarginLeft " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< ! - - < xsl : message > TAB : tabCount =
< xsl : value - of select = " $tabCount " / > , tabPosition =
< xsl : value - of select = " $tabPosition " / > , tabIndent =
< xsl : value - of select = " $tabIndent " / >
< / xsl : message > - - >
< xsl : choose >
< xsl : when test = " $tabIndent='NaN' " >
< xsl : variable name = " tabPositionTmp " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " $tabStops/style:tab-stop[last()]/@style:position " / >
< / xsl : call - template >
< / xsl : variable >
< ! - - Heuristic : for every tab that is more than specified give a further 1 cm - - >
< xsl : value - of select = " $parentMarginLeft + $tabPositionTmp + count($tabStops/style:tab-stop) - $tabCount " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $tabIndent " / >
< / xsl : otherwise >
< / xsl : choose >
< xsl : text > cm ; < / xsl : text >
< xsl : apply - templates select = " $tabStops/style:tab-stop[$tabCount]/@style:type " / >
< / xsl : template >
< ! - - OOo writes out empty paragraphs layouted behind an image ,
those have to be neglected in HTML
This method checks if an empty paragraph is of that kind ! - - >
< xsl : template name = " follows-empty-paragraphs-and-image " >
< xsl : param name = " precedingElement " / >
< xsl : param name = " elementToCheck " select = " 1 " / >
< xsl : choose >
< ! - - OOo writes out empty paragraphs layouted behind the image ,
those have to be neglected in HTML
< xsl : when test = " name() = 'text:p' and (normalize-space($childText) = '') " > - - >
< ! - - WorkAround : Test if the empty paragraph was added after an image , which OOO often does - - >
< xsl : when test = " (name($precedingElement) = 'text:p' and not($precedingElement/text()) and not($precedingElement/*)) " >
< xsl : call - template name = " follows-empty-paragraphs-and-image " >
< xsl : with - param name = " precedingElement " select = " preceding-sibling::*[$elementToCheck] " / >
< xsl : with - param name = " elementToCheck " select = " $elementToCheck +1 " / >
< / xsl : call - template >
< / xsl : when >
< xsl : when test = " $precedingElement/draw:frame " > yes < / xsl : when >
< xsl : otherwise > no < / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template name = " create-paragraph " >
< xsl : param name = " globalData " / >
< ! - - the footnote symbol is the prefix for a footnote in the footer - - >
< xsl : param name = " footnotePrefix " / >
< ! - - xhtml : p may only contain inline elements .
If there is one frame beyond , div must be used ! - - >
< xsl : variable name = " elementName " >
< xsl : choose >
< xsl : when test = " descendant::draw:frame[1] or descendant::text:p[1] " > div < / xsl : when >
< xsl : otherwise > p < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : element name = " {$elementName} " >
< xsl : choose >
< ! - - in ODF borders of paragraphs will be merged by default . Merging means the adjacent paragraphs are building a unit ,
where only the first and the last will have a border to the surrounding ( top / bottom border )
< xsl : variable name = " precedingParagraphStyle " select = " preceding-sibling::*[1][name() = 'text:p']/@text:style-name " / >
< xsl : variable name = " followingParagraphStyle " select = " following-sibling::*[1][name() = 'text:p']/@text:style-name " / >
- - >
< xsl : when test = " $globalData/all-styles/style[@style:name = current()/@text:style-name]/@mergedBorders " >
< xsl : variable name = " precedingParagraphStyle " select = " preceding-sibling::*[1][name() = 'text:p']/@text:style-name " / >
< xsl : variable name = " followingParagraphStyle " select = " following-sibling::*[1][name() = 'text:p']/@text:style-name " / >
< xsl : choose >
< xsl : when test = " $precedingParagraphStyle or $followingParagraphStyle " >
< xsl : variable name = " isPrecedingBorderParagraph " select = " $globalData/all-styles/style[@style:name = $precedingParagraphStyle]/@mergedBorders " / >
< xsl : variable name = " isFollowingBorderParagraph " select = " $globalData/all-styles/style[@style:name = $followingParagraphStyle]/@mergedBorders " / >
< xsl : choose >
< xsl : when test = " not($isPrecedingBorderParagraph) and $isFollowingBorderParagraph " >
< xsl : attribute name = " class " >
< xsl : value - of select = " concat(translate(@text:style-name, '.,;: %()[]/ \ +', '_____________'), '_borderStart') " / >
< / xsl : attribute >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : when >
< xsl : when test = " $isPrecedingBorderParagraph and not($isFollowingBorderParagraph) " >
< xsl : attribute name = " class " >
< xsl : value - of select = " concat(translate(@text:style-name, '.,;: %()[]/ \ +', '_____________'), '_borderEnd') " / >
< / xsl : attribute >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : when >
< xsl : otherwise >
< xsl : attribute name = " class " >
< xsl : value - of select = " translate(@text:style-name, '.,;: %()[]/ \ +', '_____________') " / >
< / xsl : attribute >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " write-paragraph " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " write-paragraph " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnotePrefix " select = " $footnotePrefix " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : element >
< / xsl : template >
< xsl : template name = " write-paragraph " >
< xsl : param name = " globalData " / >
< ! - - the footnote symbol is the prefix for a footnote in the footer - - >
< xsl : param name = " footnotePrefix " / >
< ! - - empty paragraph tags does not provoke a carriage return ,
therefore a non breakable space ( & nbsp ) have been inserted . - - >
< xsl : choose >
< xsl : when test = " node() " >
< xsl : call - template name = " apply-styles-and-content " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnotePrefix " select = " $footnotePrefix " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " apply-styles-and-content " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnotePrefix " select = " $footnotePrefix " / >
< / xsl : call - template >
< xsl : text > & # 160 ; < / xsl : text >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template match = " style:tab-stop/@style:type " >
< xsl : text > text - align : < / xsl : text >
< xsl : choose >
< xsl : when test = " . = 'left' " > left < / xsl : when >
< xsl : when test = " . = 'right' " > right < / xsl : when >
< xsl : when test = " . = 'center' " > center < / xsl : when >
< xsl : otherwise > justify < / xsl : otherwise >
< / xsl : choose >
< xsl : text > ; < / xsl : text >
< / xsl : template >
< ! - - As soon a frame is within a paragraph ( text : p ) or page : frame , every child element is floating ( CSS ) and worked out in sequence .
Accumulating prior frame width and adding parent ' s left margin - - >
< ! - - Matching all elements and text beyond a paragraph / text : page which are sibling of a draw : frame - - >
< xsl : template match = " * | text() " mode = " frameFloating " >
< xsl : param name = " globalData " / >
< xsl : param name = " previousFrameWidths " select = " 0 " / >
< xsl : param name = " previousFrameHeights " select = " 0 " / >
< ! - - it becomes true for siblings after a draw : frame - - >
< xsl : param name = " createDiv " select = " false() " / >
< xsl : param name = " noDivBefore " select = " true() " / >
< xsl : param name = " leftPosition " / >
< xsl : param name = " parentMarginLeft " / >
< xsl : param name = " frameAlignedToParagraphWithSvgY " / >
< xsl : choose >
< xsl : when test = " name() = 'draw:frame' " >
< xsl : copy - of select = " $frameAlignedToParagraphWithSvgY " / >
< ! - - if the first node is a draw : frame create a div - - >
< xsl : call - template name = " createDrawFrame " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths " / >
< xsl : with - param name = " previousFrameHeights " select = " $previousFrameHeights " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< / xsl : call - template >
< ! - - next elements will be called after the creation with the new indent ( plus width of frame ) - - >
< / xsl : when >
< xsl : otherwise >
< xsl : variable name = " nextSiblingIsFrame " select = " name(following-sibling::node()[1]) = 'draw:frame' " / >
< xsl : choose >
< xsl : when test = " $createDiv and normalize-space(.) != '' " >
< ! - - every following frame sibling till the next draw : frame
have to be incapuslated within a div with left indent .
To be moved altogether according the indent ( usually right ) - - >
< xsl : comment > Next ' div ' added for floating . < / xsl : comment >
< xsl : element name = " div " >
< xsl : attribute name = " style " >
< xsl : text > position : relative ; left : < / xsl : text >
< xsl : value - of select = " $leftPosition " / >
< xsl : text > cm ; < / xsl : text >
< / xsl : attribute >
< xsl : apply - templates select = " . " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< ! - - if it is a frame sibling it will be NOT incapuslated within the div ( as already within one ) - - >
< xsl : if test = " not($nextSiblingIsFrame) " >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " frameFloating " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths " / >
< xsl : with - param name = " previousFrameHeights " select = " $previousFrameHeights " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< xsl : with - param name = " leftPosition " select = " $leftPosition " / >
< xsl : with - param name = " createDiv " select = " false() " / >
< xsl : with - param name = " noDivBefore " select = " $noDivBefore " / >
< xsl : with - param name = " frameAlignedToParagraphWithSvgY " select = " $frameAlignedToParagraphWithSvgY " / >
< / xsl : apply - templates >
< / xsl : if >
< / xsl : element >
< xsl : copy - of select = " $frameAlignedToParagraphWithSvgY " / >
< ! - - Other draw : frame will be created outside of the div element - - >
< xsl : apply - templates select = " following-sibling::draw:frame[1] " mode = " frameFloating " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths " / >
< xsl : with - param name = " previousFrameHeights " select = " $previousFrameHeights " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< xsl : with - param name = " leftPosition " select = " $leftPosition " / >
< xsl : with - param name = " frameAlignedToParagraphWithSvgY " select = " $frameAlignedToParagraphWithSvgY " / >
< / xsl : apply - templates >
< / xsl : when >
< xsl : when test = " not($createDiv) " >
< xsl : apply - templates select = " . " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " frameAlignedToParagraphWithSvgY " select = " $frameAlignedToParagraphWithSvgY " / >
< / xsl : apply - templates >
< xsl : if test = " not($nextSiblingIsFrame) or $noDivBefore " >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " frameFloating " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths " / >
< xsl : with - param name = " previousFrameHeights " select = " $previousFrameHeights " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< xsl : with - param name = " leftPosition " select = " $leftPosition " / >
< xsl : with - param name = " createDiv " select = " false() " / >
< xsl : with - param name = " noDivBefore " select = " $noDivBefore " / >
< xsl : with - param name = " frameAlignedToParagraphWithSvgY " select = " $frameAlignedToParagraphWithSvgY " / >
< / xsl : apply - templates >
< / xsl : if >
< / xsl : when >
< / xsl : choose >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - - A XML node other than text or element ( e . g . comment ) should not stop the recursion - - >
< xsl : template match = " comment() " mode = " frameFloating " >
< xsl : param name = " globalData " / >
< xsl : param name = " previousFrameWidths " select = " 0 " / >
< xsl : param name = " previousFrameHeights " select = " 0 " / >
< ! - - it becomes true for siblings after a draw : frame - - >
< xsl : param name = " createDiv " select = " false() " / >
< xsl : param name = " noDivBefore " select = " true() " / >
< xsl : param name = " leftPosition " / >
< xsl : param name = " parentMarginLeft " / >
< xsl : param name = " frameAlignedToParagraphWithSvgY " / >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " frameFloating " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeft " / >
< xsl : with - param name = " leftPosition " select = " $leftPosition " / >
< xsl : with - param name = " createDiv " select = " $createDiv " / >
< xsl : with - param name = " noDivBefore " select = " $noDivBefore " / >
< / xsl : apply - templates >
< / xsl : template >
< ! - - As draw : frame may occur within more elements than in text : p and draw : page - - >
< xsl : template match = " draw:frame " >
< xsl : param name = " globalData " / >
< xsl : param name = " previousFrameWidths " select = " 0 " / >
< xsl : param name = " previousFrameHeights " select = " 0 " / >
< xsl : call - template name = " createDrawFrame " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths " / >
< xsl : with - param name = " previousFrameHeights " select = " $previousFrameHeights " / >
< / xsl : call - template >
< ! - - after the last draw : frame sibling the CSS float is disabled - - >
< xsl : if test = " @text:anchor-type!='as-char' " >
< div style = " clear:both; line-height:0; width:0; height:0; margin:0; padding:0; " > & # 160 ; < / div >
< / xsl : if >
< / xsl : template >
< xsl : template name = " getPageMarginLeft " >
< ! - - approximation to find the correct master page style ( with page dimensions ) - - >
< xsl : variable name = " masterPageNames " >
< ! - - Loop over every style : style containing a @style : master - page - name attribute - - >
< xsl : for - each select = " key('masterPage','count') " >
< ! - - Check if this style is being used in the body - - >
< xsl : if test = " key('elementUsingStyle', ../@style:name) " >
< ! - - Check every master - page - name if it is not empty and return as ';' separated list - - >
< xsl : if test = " string-length(../@style:master-page-name) > 0 " >
< xsl : value - of select = " ../@style:master-page-name " / > ;
< / xsl : if >
< / xsl : if >
< / xsl : for - each >
< / xsl : variable >
< ! - - Take the first of the masterpage list and get the according style : master - page element and find the @style : page - layout - name - - >
< xsl : variable name = " pageLayoutName " select = " key('masterPageElements', substring-before($masterPageNames,';'))/@style:page-layout-name " / >
< ! - - Find the according style : page - layout and store the properties in a variable - - >
< xsl : variable name = " pageMarginLeftAttr " select = " key('pageLayoutElements', $pageLayoutName)/style:page-layout-properties/@fo:margin-left " / >
< xsl : choose >
< xsl : when test = " $pageMarginLeftAttr " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " $pageMarginLeftAttr " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - - Elements and text aside of a draw : frame are floating , here a div is being created .
Either for a draw : frame or for text and other elements floating aside - - >
< xsl : template name = " createDrawFrame " >
< xsl : param name = " globalData " / >
< xsl : param name = " previousFrameWidths " select = " 0 " / >
< xsl : param name = " previousFrameHeights " select = " 0 " / >
< xsl : param name = " parentMarginLeft " / >
< xsl : variable name = " parentMarginLeftNew " >
< xsl : choose >
< xsl : when test = " string-length(normalize-space($parentMarginLeft)) < 1 " >
< ! - - Styles of first paragraph in list item , including ancestor styles ( inheritance ) - - >
< xsl : variable name = " paragraphName " select = " parent::*/@text:style-name " / >
< xsl : variable name = " imageParagraphStyle " select = " $globalData/all-styles/style[@style:name = $paragraphName]/final-properties " / >
< ! - - Only the left margin of the first paragraph of a list item will be added to the margin of the complete list ( all levels ) - - >
< xsl : choose >
< xsl : when test = " contains($imageParagraphStyle, 'margin-left:') " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " normalize-space(substring-before(substring-after($imageParagraphStyle, 'margin-left:'), ';')) " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $parentMarginLeft " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : variable name = " svgWidth " >
< xsl : choose >
< xsl : when test = " @svg:width " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " @svg:width " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : variable name = " svgX " >
< xsl : choose >
< xsl : when test = " @svg:x " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " @svg:x " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : variable name = " leftPosition " select = " $svgX - $parentMarginLeftNew - $previousFrameWidths " / >
< xsl : variable name = " svgY " >
< xsl : choose >
< xsl : when test = " @svg:y " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " @svg:y " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< ! - - if the frame is anchored on a paragraph - - >
< xsl : if test = " @text:anchor-type='paragraph' " >
< xsl : comment > Next ' div ' is emulating the top height of a draw : frame . < / xsl : comment >
< ! - - When the svg : y is set relative to the paragraph content , the best way to emulate a positive height ,
is to add an invisible division inbetween with a height .
Often text will flow into this ' gap ' , which is handled separately !
- - >
< xsl : if test = " $svgY > 0 " >
< xsl : element name = " div " >
< xsl : attribute name = " style " >
< xsl : text > height : < / xsl : text >
< xsl : value - of select = " $svgY " / >
< xsl : text > cm ; < / xsl : text >
< / xsl : attribute >
< xsl : text > & # 160 ; < / xsl : text >
< / xsl : element >
< / xsl : if >
< / xsl : if >
< ! - -
< xsl : variable name = " followingSibling " select = " following-sibling::node()[1] " / >
< xsl : choose >
HEURISTIC : if the frame is anchored on a paragraph and the above gab is big enough to hold a text line ,
move it behind the text
< xsl : when test = " @text:anchor-type='paragraph' and
(
( $svgY & gt ; 0 . 5 ) or
( $svgX & gt ; 4 )
) and normalize - space ( $followingSibling ) ! = ' ' " >
< xsl : apply - templates select = " $followingSibling " mode = " frameFloating " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths + $svgWidth " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeftNew " / >
< xsl : with - param name = " leftPosition " select = " $leftPosition " / >
< xsl : with - param name = " createDiv " select = " true() " / >
< xsl : with - param name = " noDivBefore " select = " false() " / >
< xsl : with - param name = " frameAlignedToParagraphWithSvgY " >
< xsl : call - template name = " createDrawFrame2 " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths + $svgWidth " / >
< xsl : with - param name = " parentMarginLeftNew " select = " $parentMarginLeftNew " / >
< xsl : with - param name = " leftPosition " select = " $leftPosition " / >
< xsl : with - param name = " svgY " select = " $svgY " / >
< / xsl : call - template >
< / xsl : with - param >
< / xsl : apply - templates >
< / xsl : when >
< xsl : otherwise > - - >
< xsl : call - template name = " createDrawFrame2 " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths + $svgWidth " / >
< xsl : with - param name = " parentMarginLeftNew " select = " $parentMarginLeftNew " / >
< xsl : with - param name = " leftPosition " select = " $leftPosition " / >
< xsl : with - param name = " svgY " select = " $svgY " / >
< / xsl : call - template >
< xsl : apply - templates select = " following-sibling::node()[1] " mode = " frameFloating " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " previousFrameWidths " select = " $previousFrameWidths + $svgWidth " / >
< xsl : with - param name = " parentMarginLeft " select = " $parentMarginLeftNew " / >
< xsl : with - param name = " leftPosition " select = " $leftPosition " / >
< xsl : with - param name = " createDiv " select = " true() " / >
< xsl : with - param name = " noDivBefore " select = " false() " / >
< / xsl : apply - templates >
< ! - -
< / xsl : otherwise >
< / xsl : choose > - - >
< / xsl : template >
< xsl : template name = " createDrawFrame2 " >
< xsl : param name = " globalData " / >
< xsl : param name = " previousFrameWidths " / >
< xsl : param name = " parentMarginLeftNew " / >
< xsl : param name = " leftPosition " / >
< xsl : param name = " svgY " / >
< xsl : variable name = " elem-name " >
< xsl : choose >
< xsl : when test = " @text:anchor-type='as-char' " > span < / xsl : when >
< xsl : otherwise > div < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : comment > Next '
< xsl : value - of select = " $elem-name " / > ' is a draw : frame .
< / xsl : comment >
< xsl : element name = " {$elem-name} " >
< xsl : choose >
< xsl : when test = " draw:object/math:math " >
< ! - - draw : frame elements contain many data that are not
relevant for mathematical formulas and that may
cause incorrect rendering . Let ' s ignore the
replacement image and keep only the id attribute .
See fdo # 66645 - - >
< xsl : apply - templates select = " @draw:name " / >
< xsl : text > < / xsl : text >
< xsl : apply - templates select = " draw:object[1] " / >
< ! - - TODO : do not always add a space after the formula ,
for example when it is followed by a comma , period ,
dash etc This will probably require using regexp
features like xsl : analyze - string - - >
< xsl : text > < / xsl : text >
< / xsl : when >
< xsl : otherwise >
< xsl : attribute name = " style " >
< xsl : call - template name = " widthAndHeight " / >
< xsl : text > padding : 0 ; < / xsl : text >
< xsl : if test = " @text:anchor-type!='as-char' " >
< ! - - all images float ( CSS float relative ) with a left position calculated by svg : x - parentMarginLeft - previousFrameWidths - - >
< xsl : text > float : left ; position : relative ; left : < / xsl : text >
< xsl : value - of select = " $leftPosition " / >
< xsl : text > cm ; < / xsl : text >
< ! - - if the frame is anchored on a char - - >
< xsl : if test = " @text:anchor-type='char' " >
< xsl : text > top : < / xsl : text >
< xsl : value - of select = " $svgY " / >
< xsl : text > cm ; < / xsl : text >
< / xsl : if >
< / xsl : if >
< / xsl : attribute >
< xsl : apply - templates select = " @* " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< xsl : apply - templates select = " node() " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : element >
< / xsl : template >
< xsl : template match = " svg:desc " / >
< xsl : template name = " widthAndHeight " >
< xsl : if test = " @svg:height | @svg:width " >
< xsl : choose >
< xsl : when test = " not(@svg:width) " >
< xsl : call - template name = " svg:height " / >
< / xsl : when >
< xsl : when test = " not(@svg:height) " >
< xsl : call - template name = " svg:width " / >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " svg:height " / >
< xsl : call - template name = " svg:width " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : if >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * * - - >
< ! - - * * * Text Span * * * - - >
< ! - - * * * * * * * * * * * * * * * * * - - >
< xsl : template match = " text:span " >
< xsl : param name = " globalData " / >
< xsl : choose >
< xsl : when test = " draw:frame " >
< ! - - sometimes an ODF image is anchored as character and the
image frame appears within a span ( which is not valid for HTML )
Heuristic : Neglecting the span assuming no text content aside
of frame within span - - >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : when >
< xsl : otherwise >
< xsl : element name = " span " >
< xsl : call - template name = " apply-styles-and-content " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : element >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * - - >
< ! - - * * * Headings * * * - - >
< ! - - * * * * * * * * * * * * * * * * - - >
< xsl : template match = " text:h " >
< xsl : param name = " globalData " / >
< ! - - no creation of empty headings ( without text content ) - - >
< xsl : if test = " text() or descendant::text() " >
< ! - - The URL linking of a table - of - content is due to a bug ( cp . bug id # 102311 ) not mapped as URL in the XML .
Linking of the table - of - content can therefore only be achieved by a work - around in HTML - - >
< xsl : call - template name = " create-heading " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : if >
< / xsl : template >
< ! - - default matching for header elements - - >
< xsl : template name = " create-heading " >
< xsl : param name = " globalData " / >
< xsl : variable name = " headingLevel " >
< xsl : choose >
< xsl : when test = " @text:outline-level < 6 " >
< xsl : value - of select = " @text:outline-level " / >
< / xsl : when >
< xsl : otherwise > 6 < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : variable name = " headertyp " select = " concat('h', $headingLevel) " / >
< xsl : element name = " {$headertyp} " >
< ! - - outline style ' text : min - label - width ' is interpreted as a CSS ' margin - right ' attribute
NOTE : Should be handled as CSS style in style header - - >
< xsl : variable name = " min-label " select = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:outline-level]/*/@text:min-label-width " / >
< xsl : attribute name = " class " >
< xsl : value - of select = " translate(@text:style-name, '.,;: %()[]/ \ +', '_____________') " / >
< / xsl : attribute >
< xsl : call - template name = " create-heading-anchor " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : element >
< / xsl : template >
< xsl : template name = " create-heading-anchor " >
< xsl : param name = " globalData " / >
< ! - - writing out a heading number if desired . - - >
< ! - - if a corresponding ' text : outline - style ' exist or is not empty - - >
< xsl : choose >
< xsl : when test = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:outline-level]/@style:num-format != '' and not(@text:is-list-header='true') " >
< ! - - Every heading element will get a unique anchor for its file , from its hierarchy level and name :
For example : The heading title ' My favorite heading ' might get < a name = " 1_2_2_My_favorite_heading " / > - - >
< ! - - creating an anchor for referencing the heading ( e . g . from content table ) - - >
< xsl : variable name = " headingNumber " >
< xsl : call - template name = " get-heading-number " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : variable >
< xsl : call - template name = " create-heading-anchor2 " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " headingNumber " select = " $headingNumber " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " create-heading-anchor2 " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template name = " get-heading-number " >
< xsl : param name = " globalData " / >
< ! - - write number prefix - - >
< xsl : value - of select = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:outline-level]/@style:num-prefix " / >
< xsl : call - template name = " write-heading-number " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< ! - - write number suffix - - >
< xsl : value - of select = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:outline-level]/@style:num-suffix " / >
< / xsl : template >
< ! - - creating an anchor for referencing the heading - - >
< xsl : template name = " create-heading-anchor2 " >
< xsl : param name = " globalData " / >
< xsl : param name = " headingNumber " / >
< xsl : variable name = " title " >
< xsl : apply - templates mode = " concatenate " / >
< / xsl : variable >
< ! - - REFERENCE HANDLING - ANCHOR - - >
< xsl : element namespace = " {$namespace} " name = " a " >
< xsl : attribute name = " id " >
< xsl : value - of select = " translate(concat('a_',normalize-space($headingNumber), '_', normalize-space($title)), '
&<>– .,;: %()[]/ \ +', '____________________________') " disable - output - escaping = " yes " / >
< / xsl : attribute >
< xsl : element name = " span " >
< ! - - Convert the " label-followed-by " to margins . According to ODF , possible values are : ' listtab ' , ' space ' , and ' nothing ' .
' space ' seems not to be written out by LO , and for ' nothing ' we obviously need do nothing .
NOTE : Should be handled as CSS style in style header - - >
< xsl : variable name = " currentOutlineLevel " select = " @text:outline-level " / >
< xsl : variable name = " labelFollowedBy " select = " $globalData//office:document/office:styles/text:outline-style/text:outline-level-style[@text:level = $currentOutlineLevel]/style:list-level-properties[@text:list-level-position-and-space-mode='label-alignment']/style:list-level-label-alignment/@text:label-followed-by " / >
< ! - - Add some margin , but only if there is a number preceding the heading . - - >
< xsl : if test = " $labelFollowedBy='listtab' and $headingNumber != '' " >
< xsl : attribute name = " class " >
< xsl : text > heading_numbering < / xsl : text >
< / xsl : attribute >
< / xsl : if >
< xsl : copy - of select = " $headingNumber " / >
< / xsl : element >
< / xsl : element >
< / xsl : template >
< xsl : template name = " write-heading-number " >
< xsl : param name = " globalData " / >
< ! - - By default heading start with '1' , the parameter ' textStartValue ' will only be set , if the attribute @text : start - value exist - - >
< xsl : choose >
< xsl : when test = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:outline-level]/@text:start-value " >
< xsl : call - template name = " calc-heading-number " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " outlineLevel " select = " @text:outline-level " / >
< xsl : with - param name = " textStartValue " select = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:outline-level]/@text:start-value " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " calc-heading-number " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " outlineLevel " select = " @text:outline-level " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - -
Find the correct heading no . , which is the sum of ' text : start - value '
and preceding siblings of ' text : h ' with the same ' text : outline - level ' ( until a text : outline - level with lower value is found ) .
If the ' text : start - value is not set the default value of '1' has to be taken .
If a heading number is found ( e . g . text : outline - level = '3' ) all heading numbers
for the higher levels have to be written out - - >
< xsl : template name = " calc-heading-number " >
< xsl : param name = " globalData " / >
< xsl : param name = " outlineLevel " / > < ! - - text level of the heading - - >
< xsl : param name = " iOutlineLevel " select = " 1 " / > < ! - - iterator , counts from 1 to the text level of the heading - - >
< xsl : param name = " textStartValue " select = " 1 " / > < ! - - text level to start with , default is '1' - - >
< xsl : choose >
< ! - - iText levels counts up from '1' to outlineLevel
Which means writing a heading number from left to right - - >
< xsl : when test = " $iOutlineLevel < $outlineLevel " >
< ! - - Write preceding heading numbers - - >
< xsl : if test = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = ($iOutlineLevel)]/@style:num-format != '' " >
< xsl : call - template name = " writeNumber " >
< xsl : with - param name = " numberDigit " >
< xsl : call - template name = " calc-heading-digit " >
< xsl : with - param name = " value " select = " 0 " / >
< xsl : with - param name = " currentoutlineLevel " select = " $iOutlineLevel " / >
< / xsl : call - template >
< / xsl : with - param >
< xsl : with - param name = " numberFormat " select = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = ($iOutlineLevel)]/@style:num-format " / >
< / xsl : call - template >
< / xsl : if >
< xsl : choose >
< xsl : when test = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = ($iOutlineLevel + 1)]/@text:start-value " >
< xsl : call - template name = " calc-heading-number " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " outlineLevel " select = " $outlineLevel " / >
< xsl : with - param name = " iOutlineLevel " select = " $iOutlineLevel + 1 " / >
< xsl : with - param name = " textStartValue " select = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = ($iOutlineLevel + 1)]/@text:start-value " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " calc-heading-number " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " outlineLevel " select = " $outlineLevel " / >
< xsl : with - param name = " iOutlineLevel " select = " $iOutlineLevel + 1 " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< xsl : otherwise >
< ! - - Write preceding heading numbers - - >
< xsl : call - template name = " writeNumber " >
< xsl : with - param name = " numberDigit " >
< xsl : call - template name = " calc-heading-digit " >
< xsl : with - param name = " value " select = " $textStartValue " / >
< xsl : with - param name = " currentoutlineLevel " select = " $iOutlineLevel " / >
< / xsl : call - template >
< / xsl : with - param >
< xsl : with - param name = " numberFormat " select = " $globalData/office:styles/text:outline-style/text:outline-level-style[@text:level = $iOutlineLevel]/@style:num-format " / >
< xsl : with - param name = " last " select = " true() " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template name = " writeNumber " >
< xsl : param name = " numberDigit " / >
< xsl : param name = " numberFormat " / >
< xsl : param name = " last " / >
< xsl : choose >
< xsl : when test = " not($numberFormat) " >
< xsl : number value = " $numberDigit " format = " 1. " / >
< / xsl : when >
< xsl : otherwise >
< xsl : choose >
< xsl : when test = " $last " >
< xsl : number value = " $numberDigit " format = " {$numberFormat} " / >
< / xsl : when >
< xsl : otherwise >
< xsl : number value = " $numberDigit " format = " {$numberFormat}. " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template name = " calc-heading-digit " >
< xsl : param name = " value " / >
< xsl : param name = " currentoutlineLevel " / >
< xsl : param name = " i " select = " 1 " / >
< xsl : variable name = " precedingHeading " select = " preceding-sibling::text:h[@text:outline-level <= $currentoutlineLevel][$i] " / >
< xsl : variable name = " precedingoutlineLevel " select = " $precedingHeading/@text:outline-level " / >
< ! - - tdf # 107696 : if text : h has attribute " is-list-header " with " true " value , it mustn ' t be counted for numbering - - >
< xsl : variable name = " precedingoutlineLevel-is-list-header " select = " $precedingHeading[@text:is-list-header='true']/@text:outline-level " / >
< xsl : choose >
< xsl : when test = " ($currentoutlineLevel = $precedingoutlineLevel) and (not($precedingoutlineLevel-is-list-header)) " >
< xsl : call - template name = " calc-heading-digit " >
< xsl : with - param name = " value " select = " $value + 1 " / >
< xsl : with - param name = " currentoutlineLevel " select = " $currentoutlineLevel " / >
< xsl : with - param name = " i " select = " $i + 1 " / >
< / xsl : call - template >
< / xsl : when >
< ! - - tdf # 107696 : case text : h has attribute " is-list-header " with " true " value , we don ' t increment value - - >
< xsl : when test = " ($currentoutlineLevel = $precedingoutlineLevel) and ($precedingoutlineLevel-is-list-header) " >
< xsl : call - template name = " calc-heading-digit " >
< xsl : with - param name = " value " select = " $value " / >
< xsl : with - param name = " currentoutlineLevel " select = " $currentoutlineLevel " / >
< xsl : with - param name = " i " select = " $i + 1 " / >
< / xsl : call - template >
< / xsl : when >
< xsl : when test = " $currentoutlineLevel < $precedingoutlineLevel " >
< xsl : message terminate = " yes " > this should not happen < / xsl : message >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $value " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - - Neglect Annotations - - >
< xsl : template match = " office:annotation " mode = " concatenate " / >
< ! - - Match text : placeholder child nodes ( e . g . text ) - - >
< xsl : template match = " text:placeholder " >
< xsl : param name = " globalData " / >
< xsl : call - template name = " apply-styles-and-content " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : template >
< ! - - * * * * * * * * * * * * * - - >
< ! - - * * * Link * * * - - >
< ! - - * * * * * * * * * * * * * - - >
< xsl : template match = " text:a | draw:a " >
< xsl : param name = " globalData " / >
< xsl : call - template name = " create-common-anchor-link " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : template >
< xsl : template name = " create-common-anchor-link " >
< xsl : param name = " globalData " / >
< xsl : element name = " a " >
< xsl : attribute name = " href " >
< xsl : call - template name = " create-href " >
< xsl : with - param name = " href " select = " @xlink:href " / >
< / xsl : call - template >
< / xsl : attribute >
< xsl : call - template name = " apply-styles-and-content " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : element >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * * * * - - >
< ! - - * * * Image Link * * * - - >
< ! - - * * * * * * * * * * * * * * * * * * * - - >
< ! - - currently suggesting that all draw : object - ole elements are images - - >
< xsl : template match = " draw:image | draw:object-ole " >
< xsl : param name = " globalData " / >
< ! - - If there is a replacement graphic , we take it ( only exception is if the main image is svg ) .
The replacement graphic is a png which browsers are more likely able to render than the
original graphic which might have arbitrary formats . - - >
< xsl : if test = " (@loext:mime-type = 'image/svg+xml') or
( @draw : mime - type = ' image / svg + xml ' ) or
( not ( following - sibling : : draw : image ) and
not ( ( preceding - sibling : : draw : image [ 1 ] / @loext : mime - type = ' image / svg + xml ' )
or
( preceding - sibling : : draw : image [ 1 ] / @draw : mime - type = ' image / svg + xml ' ) ) ) " >
< xsl : choose >
< xsl : when test = " ancestor::text:p or parent::text:span or parent::text:h or parent::draw:a or parent::text:a or text:ruby-base " >
< ! - - XHTML does not allow the mapped elements to contain paragraphs - - >
< xsl : call - template name = " create-image-element " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< ! - - images are embedded in a paragraph , but are in CSS not able to express a horizontal alignment for themself .
A ' div ' element taking over the image style would solve that problem , but is invalid as child of a paragraph - - >
< xsl : element name = " p " >
< xsl : apply - templates select = " @draw:style-name " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< xsl : call - template name = " create-image-element " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : element >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : if >
< / xsl : template >
< xsl : template name = " create-image-element " >
< xsl : param name = " globalData " / >
< xsl : element name = " img " >
< xsl : if test = " ../@svg:width or ../@svg:height " >
< xsl : attribute name = " style " >
< xsl : if test = " ../@svg:height " >
< xsl : text > height : < / xsl : text >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " ../@svg:height " / >
< / xsl : call - template >
< xsl : text > cm ; < / xsl : text >
< / xsl : if >
< xsl : if test = " ../@svg:width " >
< xsl : text > width : < / xsl : text >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " ../@svg:width " / >
< / xsl : call - template >
< xsl : text > cm ; < / xsl : text >
< / xsl : if >
< / xsl : attribute >
< / xsl : if >
< xsl : attribute name = " alt " >
< xsl : choose >
< xsl : when test = " ../svg:title " >
< xsl : value - of select = " ../svg:title " / >
< / xsl : when >
< xsl : otherwise >
< xsl : message >
Accessibility Warning :
No alternate text ( ' svg : title ' element ) set for
image '
< xsl : value - of select = " @xlink:href " / > ' !
< / xsl : message >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : attribute >
< xsl : attribute name = " src " >
< xsl : call - template name = " create-href " >
< xsl : with - param name = " href " select = " @xlink:href " / >
< xsl : with - param name = " mimetype " >
< xsl : choose >
< xsl : when test = " @draw:mime-type " >
< xsl : value - of select = " @draw:mime-type " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " @loext:mime-type " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< / xsl : call - template >
< / xsl : attribute >
< ! - - style interpretation only , as no subelements are allowed for img in XHTML - - >
< xsl : apply - templates select = " @draw:style-name " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : element >
< / xsl : template >
< ! - - * * * * * * * * * * * * - - >
< ! - - * * * list * * * - - >
< ! - - * * * * * * * * * * * * - - >
< ! - -
Due to the requirements below the ODF list functionality is not handled by CSS , but the list labels calculated and written by XSLT .
REQUIREMENTS :
= = = = = = = = = = = = =
A )
One significant difference between XHTML and Office List elements is that a list without text nodes but only further list children
would not show a list symbol in the Office , but in the browser from XHTML .
B )
Since OASIS Open Document XML ( implemented in OOo2 . 0 ) only one parent type exists for list items
the ' text : list ' element . The XHTML element ' ol ' , ' ul ' will be chosen upon the list style type .
C )
An Office list may be spread over the whole document . Linked by their style and text : continue - numbering = ' true ' .
D )
An Office list can use characters or images as list label .
E )
An Office list can have a prefix and suffix around the list label .
F )
An Office list style may have the attribute consecutive numbering , which resolves in a list counting for all levels
G )
An Office list may ( re ) start on any arbitrary value by using @text : start - value on the text : list - item
INDENTATION :
= = = = = = = = = = = =
The indent of a list label is not only calculated by using the text : space - before of the list level ( listLevelStyle ) , but
as well taking the left margin of the first paragraph ( or heading ) of the list into account as loy match = " " name = " " use = " " / > ng it is not negative .
| MARGIN LEFT | LABEL |
| text : space - before ( listlevelstyle ) | text : min - label - width |
| + fo : left - margin ( firstParagraph ) | |
Further details beyond text : list - list . . .
- - >
< xsl : key name = " listStyles " match = " /*/office:styles/text:list-style | /*/office:automatic-styles/text:list-style | /*/office:styles/style:graphic-properties/text:list-style | /*/office:automatic-styles/style:graphic-properties/text:list-style | /*/office:styles/text:list-style | /*/office:automatic-styles/text:list-style | /*/office:styles/style:graphic-properties/text:list-style | /*/office:automatic-styles/style:graphic-properties/text:list-style " use = " @style:name " / >
< ! - -
A text list may only have text : list - item and text : list - header as children .
- - >
< xsl : template match = " text:list " >
< xsl : param name = " globalData " / >
< xsl : param name = " isListNumberingReset " / >
< xsl : param name = " isNextLevelNumberingReset " / >
< xsl : param name = " listLevel " select = " 1 " / >
< xsl : param name = " listRestart " select = " false() " / >
< xsl : param name = " itemLabel " select = " '' " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " select = " @text:style-name " / >
< ! - - To choose list type - get the list style , with the same ' text : style - name ' and same ' text : level ' > - - >
< xsl : variable name = " listStyleRTF " >
< xsl : variable name = " listStyleInContentFile " select = " key('listStyles', $listStyleName) " / >
< xsl : choose >
< xsl : when test = " $listStyleInContentFile " >
< xsl : copy - of select = " $listStyleInContentFile " / >
< / xsl : when >
< xsl : when test = " $globalData/office:styles/text:list-style[@style:name = $listStyleName] " >
< xsl : copy - of select = " $globalData/office:styles/text:list-style[@style:name = $listStyleName] " / >
< / xsl : when >
< xsl : when test = " $globalData/office:styles/style:graphic-properties/text:list-style[@style:name = $listStyleName] " >
< xsl : copy - of select = " $globalData/office:styles/style:graphic-properties/text:list-style[@style:name = $listStyleName] " / >
< / xsl : when >
< / xsl : choose >
< / xsl : variable >
< xsl : choose >
< xsl : when test = " function-available('common:node-set') " >
< xsl : call - template name = " create-list-type " >
< xsl : with - param name = " listStyle " select = " common:node-set($listStyleRTF) " / >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< / xsl : call - template >
< / xsl : when >
< xsl : when test = " function-available('xalan:nodeset') " >
< xsl : call - template name = " create-list-type " >
< xsl : with - param name = " listStyle " select = " xalan:nodeset($listStyleRTF) " / >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< / xsl : call - template >
< / xsl : when >
< xsl : when test = " function-available('xt:node-set') " >
< xsl : call - template name = " create-list-type " >
< xsl : with - param name = " listStyle " select = " xt:node-set($listStyleRTF) " / >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : message terminate = " yes " > The required node - set function was not found ! < / xsl : message >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template name = " create-list-type " >
< xsl : param name = " globalData " / >
< xsl : param name = " isListNumberingReset " / >
< xsl : param name = " isNextLevelNumberingReset " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listRestart " / >
< xsl : param name = " itemLabel " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< ! - - $globalData / styles - file / * / office : styles / - - >
< xsl : variable name = " listLevelStyle " select = " $listStyle/*/*[@text:level = number($listLevel)] " / >
< xsl : variable name = " listIndent " >
< xsl : call - template name = " getListIndent " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " firstPara " select = " *[1]/*[name() = 'text:p' or name() = 'text:h'][1] " / >
< / xsl : call - template >
< / xsl : variable >
< xsl : variable name = " isEmptyList " select = " not(*[1]/*[name() = 'text:h' or name() = 'text:p' or name() = 'text:name']) " / >
< xsl : variable name = " listType " >
< xsl : choose >
< ! - - ordered list - - >
< xsl : when test = " name($listLevelStyle) = 'text:list-level-style-number' " >
< xsl : text > ol < / xsl : text >
< / xsl : when >
< ! - - unordered list ( bullet or image ) - - >
< xsl : otherwise >
< xsl : text > ul < / xsl : text >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : element name = " {$listType} " >
< xsl : apply - templates select = " *[1] " mode = " listItemSibling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isListNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " >
< xsl : choose >
< xsl : when test = " $isListNumberingReset " >
< xsl : value - of select = " true() " / >
< / xsl : when >
< xsl : otherwise >
< ! - - A list is empty if a text : list does not have a text : list - header or text : list - item ( wildcard as only those can exist beyond a text : list ) , which contains a text : h or text : p - - >
< xsl : value - of select = " not($isEmptyList) " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listRestart " >
< xsl : choose >
< xsl : when test = " $listRestart " >
< xsl : value - of select = " $listRestart " / >
< / xsl : when >
< xsl : otherwise >
< ! - - descendants restart their list numbering , when an ancestor is not empty - - >
< xsl : value - of select = " not($isEmptyList) " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " minLabelDist " >
< xsl : choose >
< xsl : when test = " $listLevelStyle/*/@text:min-label-distance " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " $listLevelStyle/*/@text:min-label-distance " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< xsl : with - param name = " minLabelWidth " >
< xsl : choose >
< xsl : when test = " $listLevelStyle/*/@text:min-label-width " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " $listLevelStyle/*/@text:min-label-width " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< / xsl : apply - templates >
< / xsl : element >
< / xsl : template >
< ! - - See comment before text : list template - - >
< xsl : template name = " getListIndent " >
< xsl : param name = " globalData " / >
< xsl : param name = " listLevelStyle " / >
< ! - - The first paragraph of the list item ( heading is special paragraph in ODF ) - - >
< xsl : param name = " firstPara " / >
< ! - - Styles of first paragraph in list item , including ancestor styles ( inheritance ) - - >
< xsl : variable name = " firstParaStyles " select = " $globalData/all-styles/style[@style:name = $firstPara/@text:style-name]/final-properties " / >
< ! - - Only the left margin of the first paragraph of a list item will be added to the margin of the complete list ( all levels ) - - >
< xsl : variable name = " firstParaLeftMargin " >
< xsl : choose >
< xsl : when test = " contains($firstParaStyles, 'margin-left:') " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " normalize-space(substring-before(substring-after($firstParaStyles, 'margin-left:'), ';')) " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : variable name = " spaceBefore " >
< xsl : choose >
< xsl : when test = " $listLevelStyle/*/@text:space-before " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " $listLevelStyle/*/@text:space-before " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise > 0 < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< ! - - Only if the left - margin of the first paragraph is positive the sum
text : space - before and fo : left - margin is taken as list indent - - >
< xsl : choose >
< xsl : when test = " $firstParaLeftMargin > 0 " >
< xsl : value - of select = " $firstParaLeftMargin + $spaceBefore " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $spaceBefore " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * * * - - >
< ! - - * * * list item * * * - - >
< ! - - * * * * * * * * * * * * * * * * * * - - >
2019-04-15 10:23:03 +08:00
< ! - -
2021-06-23 10:26:22 +08:00
Left margin of the complete list :
The space between left page and the list symbol ( left - margin ) is in the Office implemented by
the sum of three values :
1 ) ' text : space - before ' , which is part of the ' text : list - style ' element .
2 ) ' margin : left ' from the style of the first child ( e . g . paragraph ) .
3 ) ' fo : text - indent ' the indent of the first line of some child ( e . g . paragraph ) ( applied by CSS class style )
2019-04-15 10:23:03 +08:00
2021-06-23 10:26:22 +08:00
Possible list children :
< ! ELEMENT text : list - item ( text : p | text : h | text : list ) + >
2019-04-15 10:23:03 +08:00
2021-06-23 10:26:22 +08:00
In the Office the list label before the text depends on two attributes :
- ' text : min - label - width ' : the distance between list label and all text of the list item .
- ' text : min - label - distance ' : the distance between list label and text of the first line ,
only used , when text does not fit in text : min - label - width ( ignored )
2019-04-15 10:23:03 +08:00
- - >
2021-06-23 10:26:22 +08:00
< xsl : template match = " text:list-item | text:list-header " mode = " listItemSibling " >
< xsl : param name = " globalData " / >
< xsl : param name = " firstitemLabelWidth " / >
< xsl : param name = " isEmptyList " select = " not(*[name() = 'text:h' or name() = 'text:p' or name() = 'text:name']) " / >
< xsl : param name = " isListNumberingReset " / >
< xsl : param name = " isNextLevelNumberingReset " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " itemLabel " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listLevelStyle " / >
< xsl : param name = " listRestart " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : param name = " minLabelDist " / >
< xsl : param name = " minLabelWidth " / >
< xsl : param name = " listIndent " / >
< ! - - The text : list - header shall not be labeled . According to ODF specification ( sect . 4 . 3 . 2 ) :
" The <text:list-header> element represents a list header and is a special kind of list item. It
contains one or more paragraphs that are displayed before a list . The paragraphs are formatted
like list items but they do not have a preceding number or bullet . " -->
< xsl : variable name = " isListHeader " select = " boolean(self::text:list-header) " / >
< xsl : variable name = " listIndentNew " >
< xsl : choose >
< xsl : when test = " $listIndent " >
< xsl : value - of select = " $listIndent " / >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " getListIndent " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " firstPara " select = " *[name() = 'text:p' or name() = 'text:h'][1] " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : variable name = " itemNumberNew " >
< xsl : if test = " $listStyle/text:list-style/text:list-level-style-number " >
< xsl : choose >
< xsl : when test = " $isListHeader " > 0 < / xsl : when >
< xsl : when test = " $isEmptyList " >
< ! - - An empty list item ( no text : h / text : p as child ) , will not count as item and does not increment the count . - - >
< xsl : variable name = " tempItemNumber " >
< xsl : choose >
< ! - - siblings will be incremented by one - - >
< xsl : when test = " $itemNumber " >
< xsl : if test = " not($isListHeader) " >
< xsl : value - of select = " $itemNumber + 1 " / >
< / xsl : if >
< / xsl : when >
< ! - - if a higher list level had content the numbering starts with 1 - - >
< xsl : when test = " $isListNumberingReset and $listLevel > 1 " >
< xsl : value - of select = " 1 " / >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " getItemNumber " >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : choose >
< ! - - in case the empty list - item is the first list - item in document - - >
< xsl : when test = " $tempItemNumber = 1 " >
< xsl : value - of select = " 1 " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $tempItemNumber - 1 " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< xsl : otherwise >
< xsl : choose >
< xsl : when test = " @text:start-value " >
< xsl : value - of select = " @text:start-value " / >
< / xsl : when >
< ! - - text : start - value from list level style will only be taken on the first list - item of a list - - >
< xsl : when test = " $listLevelStyle/@text:start-value and count(preceding-sibling::text:list-item) = 0 " >
< xsl : value - of select = " $listLevelStyle/@text:start-value " / >
< / xsl : when >
< ! - - siblings will be incremented by one - - >
< xsl : when test = " $itemNumber " >
< xsl : value - of select = " $itemNumber + 1 " / >
< / xsl : when >
< ! - - if a higher list level had content the numbering starts with 1 - - >
< xsl : when test = " $isListNumberingReset and $listLevel > 1 " >
< xsl : value - of select = " 1 " / >
< / xsl : when >
< xsl : otherwise >
< xsl : call - template name = " getItemNumber " >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : if >
< / xsl : variable >
< xsl : variable name = " itemLabelNew " >
< xsl : if test = " $listStyle/text:list-style/text:list-level-style-number " >
< ! - -
A numbered label ( e . g . 2 . C . III ) is created for every text : list - item / header .
Above list levels are listed in the label , if the list - style requires this . Levels are separated by a '.'
Formatation is dependent for every list level depth .
The label is passed from ancestor text : list - item / header and if required truncated .
The prefix / suffix ( as well list level dependent ) comes before and after the complete label ( after truncation )
- - >
< ! - - Numbered label will be generated - - >
< xsl : call - template name = " createItemLabel " >
< xsl : with - param name = " itemNumber " select = " $itemNumberNew " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listLevelsToDisplay " >
< xsl : variable name = " display " select = " $listLevelStyle/@text:display-levels " / >
< xsl : choose >
< xsl : when test = " $display " >
< xsl : value - of select = " $display " / >
< / xsl : when >
< xsl : when test = " $isListHeader " > 0 < / xsl : when >
< xsl : otherwise > 1 < / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< / xsl : call - template >
< / xsl : if >
< / xsl : variable >
< xsl : element name = " li " >
< xsl : choose >
< xsl : when test = " $isEmptyList or $isListHeader " >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " itemLabel " select = " $itemLabelNew " / >
< xsl : with - param name = " listLevel " select = " $listLevel + 1 " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< / xsl : apply - templates >
< / xsl : when >
< xsl : otherwise >
< ! - - Possible following children are text : h , text : p , list : text , text : soft - page - break - - >
< xsl : apply - templates mode = " list-item-children " select = " *[1] " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isListHeader or $isNextLevelNumberingReset " / >
< ! - - The new created label is given to the children - - >
< xsl : with - param name = " itemLabel " select = " $itemLabelNew " / >
< xsl : with - param name = " listLabelElement " >
< xsl : choose >
< xsl : when test = " name() = 'text:list-header' " / >
< xsl : otherwise >
< xsl : variable name = " listLabelWidth " >
< xsl : choose >
< xsl : when test = " $minLabelWidth > $minLabelDist " >
< xsl : value - of select = " $minLabelWidth " / >
< / xsl : when >
< xsl : otherwise >
< xsl : choose >
< xsl : when test = " $minLabelDist > 0 " >
< xsl : value - of select = " $minLabelDist " / >
< / xsl : when >
< xsl : otherwise >
< xsl : variable name = " listLevelLabelAlignment " select = " $listLevelStyle/style:list-level-properties/style:list-level-label-alignment " / >
< xsl : variable name = " listLevelTextIndent " >
< xsl : call - template name = " convert2cm " >
< xsl : with - param name = " value " select = " string($listLevelLabelAlignment/@fo:text-indent) " / >
< / xsl : call - template >
< / xsl : variable >
< xsl : value - of select = " -$listLevelTextIndent " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< ! - - Numbering is being done by this transformation creating a HTML span representing the number label
The html : span represents the list item / header label ( e . g . 1 . A . III )
As the html : span is usually an inline element is formatted by CSS as block element to use width upon it ,
to disable the carriage return float : left is used and later neglected - - >
< xsl : element name = " span " >
< xsl : if test = " $listLevelStyle/@text:style-name " >
< xsl : attribute name = " class " >
< xsl : value - of select = " $listLevelStyle/@text:style-name " / >
< / xsl : attribute >
< / xsl : if >
< xsl : attribute name = " style " >
< xsl : text > display : block ; float : < / xsl : text >
< ! - - 2DO : Svante - copy this functionality for other used margin : left ( in western country ' left ' ) - - >
< xsl : call - template name = " getOppositeWritingDirection " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " paraStyleName " select = " descendant-or-self::*/@text:style-name " / >
< / xsl : call - template >
< xsl : text > ; min - width : < / xsl : text >
< xsl : value - of select = " $listLabelWidth " / >
< xsl : text > cm ; < / xsl : text >
< / xsl : attribute >
< xsl : variable name = " labelContent " >
< xsl : choose >
< xsl : when test = " text:number " >
< xsl : apply - templates select = " text:number " mode = " listnumber " / >
< / xsl : when >
< xsl : when test = " name($listLevelStyle) = 'text:list-level-style-bullet' " >
< xsl : value - of select = " $listLevelStyle/@style:num-prefix " / >
< xsl : value - of select = " $listLevelStyle/@text:bullet-char " / >
< xsl : value - of select = " $listLevelStyle/@style:num-suffix " / >
< / xsl : when >
< xsl : when test = " name($listLevelStyle) = 'text:list-level-style-number' " >
< xsl : value - of select = " $listLevelStyle/@style:num-prefix " / >
< xsl : value - of select = " $itemLabelNew " / >
< xsl : value - of select = " $listLevelStyle/@style:num-suffix " / >
< / xsl : when >
< xsl : otherwise >
< ! - - Listing with image as bullets , taken from the list style ' s href - - >
< xsl : value - of select = " $listLevelStyle/@xlink:href " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< ! - - Some browsers have problem with stand - alone elements ( e . g . < span / > )
Therefore a comment is being inserted into an empty label - - >
< xsl : choose >
< xsl : when test = " $labelContent != '' " >
< xsl : value - of select = " $labelContent " / >
< / xsl : when >
< xsl : otherwise >
< xsl : comment > & # 160 ; < / xsl : comment >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : element >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< xsl : with - param name = " listLabelEmptyElement " >
< xsl : variable name = " listLabelWidth " >
< xsl : choose >
< xsl : when test = " $minLabelWidth > $minLabelDist " >
< xsl : value - of select = " $minLabelWidth " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $minLabelDist " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : element name = " span " >
< xsl : if test = " $listLevelStyle/@text:style-name " >
< xsl : attribute name = " class " >
< xsl : value - of select = " $listLevelStyle/@text:style-name " / >
< / xsl : attribute >
< / xsl : if >
< xsl : attribute name = " style " >
< xsl : text > display : block ; float : < / xsl : text >
< xsl : call - template name = " getOppositeWritingDirection " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " paraStyleName " select = " descendant-or-self::*/@text:style-name " / >
< / xsl : call - template >
< xsl : text > ; min - width : < / xsl : text >
< xsl : value - of select = " $listLabelWidth " / >
< xsl : text > cm < / xsl : text >
< / xsl : attribute >
< xsl : comment > & # 160 ; < / xsl : comment >
< / xsl : element >
< / xsl : with - param >
< xsl : with - param name = " listLevel " select = " $listLevel + 1 " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " listIndent " select = " $listIndentNew " / >
< xsl : with - param name = " minLabelWidth " select = " $minLabelWidth " / >
< / xsl : apply - templates >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : element >
< xsl : apply - templates select = " following-sibling::*[1] " mode = " listItemSibling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " itemNumber " select = " $itemNumberNew " / >
< xsl : with - param name = " listIndent " >
< xsl : choose >
< xsl : when test = " not($isEmptyList) " >
< xsl : value - of select = " $listIndentNew " / >
< / xsl : when >
< / xsl : choose >
< / xsl : with - param >
< ! - - Receives the same parent label - - >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " minLabelDist " select = " $minLabelDist " / >
< xsl : with - param name = " minLabelWidth " select = " $minLabelWidth " / >
< / xsl : apply - templates >
< / xsl : template >
< xsl : template name = " getOppositeWritingDirection " >
< xsl : param name = " globalData " / >
< xsl : param name = " paraStyleName " / >
< xsl : variable name = " imageParagraphStyle " select = " $globalData/all-styles/style[@style:name = $paraStyleName]/final-properties " / >
< xsl : choose >
< xsl : when test = " contains($imageParagraphStyle, 'writing-mode:') " >
< xsl : choose >
< xsl : when test = " contains(substring-before(substring-after($imageParagraphStyle, 'writing-mode:'), ';'), 'rl') " > right < / xsl : when >
< xsl : otherwise > left < / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< xsl : otherwise > left < / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template match = " text:number " mode = " listnumber " >
< xsl : apply - templates / >
< / xsl : template >
< xsl : template match = " text:number " mode = " list-item-children " >
< xsl : param name = " globalData " / >
< xsl : param name = " listLabelElement " / >
< xsl : param name = " listLabelEmptyElement " / >
< xsl : param name = " isEmptyList " / >
< xsl : param name = " isListNumberingReset " / >
< xsl : param name = " isNextLevelNumberingReset " / >
< xsl : param name = " itemLabel " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " listIndent " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listLevelStyle " / >
< xsl : param name = " listRestart " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : param name = " minLabelWidth " / >
< xsl : apply - templates mode = " list-item-children " select = " following-sibling::*[1] " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listLabelElement " select = " $listLabelElement " / >
< xsl : with - param name = " listLabelEmptyElement " select = " $listLabelEmptyElement " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< xsl : with - param name = " minLabelWidth " select = " $minLabelWidth " / >
< / xsl : apply - templates >
< / xsl : template >
< ! - - Each key element holds the set of all text : list - item / text : list - header of a certain level and a certain style - - >
< xsl : key name = " getListItemsByLevelAndStyle " use = " concat(count(ancestor::text:list), ancestor::text:list/@text:style-name) " match = " text:list-item | text:list-header " / >
< ! - - Each key element holds the set of all text : list - item / text : list - header of a certain style - - >
< xsl : key name = " getListItemsByStyle " use = " ancestor::text:list/@text:style-name " match = " text:list-item | text:list-header " / >
< ! - - The Numbering start value ( or offset from regular counteing ) is used at the first item of offset ,
but have to be reused on following items with no text : start - value - - >
< xsl : template name = " getItemNumber " >
< xsl : param name = " listLevel " / >
< xsl : param name = " listLevelStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : param name = " listStyle " / >
< xsl : call - template name = " countListItemTillStartValue " >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " preceding::text:list-item[generate-id(key('getListItemsByLevelAndStyle', concat($listLevel, $listStyleName))) = generate-id(key('getListItemsByLevelAndStyle', concat(count(ancestor::text:list), ancestor::text:list/@text:style-name)))] " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " preceding::text:list-item[generate-id(key('getListItemsByStyle', $listStyleName)) = generate-id(key('getListItemsByStyle', ancestor::text:list/@text:style-name))] " / >
< / xsl : call - template >
< / xsl : template >
< ! - - When there is a text : start - value the last have to be found and added to the number - - >
< xsl : template name = " countListItemTillStartValue " >
< xsl : param name = " IteratorSameLevelAndStyle " select = " 1 " / >
< xsl : param name = " IteratorSameStyle " select = " 1 " / >
< xsl : param name = " itemNumber " select = " 1 " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listLevelStyle " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : param name = " precedingListItemsOfSameLevelAndStyle " / >
< xsl : param name = " precedingListItemsOfSameLevelAndStyleCount " select = " count($precedingListItemsOfSameLevelAndStyle) " / >
< xsl : param name = " precedingListItemsOfSameStyle " / >
< xsl : param name = " precedingListItemsOfSameStyleCount " select = " count($precedingListItemsOfSameStyle) " / >
< ! - - E . g . : If a list level 2 number is searched , a level 3 with content found with only a level 1 parent with content ,
the level 3 gets a ' pseudoLevel ' - - >
< xsl : param name = " pseudoLevel " select = " 0 " / >
< xsl : variable name = " isListHeader " select = " boolean(self::text:list-header) " / >
< xsl : variable name = " isEmptyList " select = " not(*[name() = 'text:h' or name() = 'text:p']) " / >
< ! - - set the next of preceding list items . Starting from the current to the next previous text : list - item - - >
< xsl : variable name = " precedingListItemOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle[$precedingListItemsOfSameLevelAndStyleCount - $IteratorSameLevelAndStyle + 1] " / >
< xsl : variable name = " precedingListItemOfSameStyle " select = " $precedingListItemsOfSameStyle[$precedingListItemsOfSameStyleCount - $IteratorSameStyle + 1] " / >
< xsl : choose >
< xsl : when test = " ($precedingListItemOfSameStyle and $precedingListItemOfSameLevelAndStyle) or ($precedingListItemOfSameStyle and $listStyle/text:list-style/@text:consecutive-numbering) " >
< xsl : for - each select = " $precedingListItemOfSameStyle " >
< xsl : choose >
< ! - - if it is a higher list level element - - >
< xsl : when test = " $listStyle/text:list-style/@text:consecutive-numbering " >
< xsl : call - template name = " countListItem " >
< xsl : with - param name = " IteratorSameLevelAndStyle " select = " $IteratorSameLevelAndStyle " / >
< xsl : with - param name = " IteratorSameStyle " select = " $IteratorSameStyle " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyleCount " select = " $precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " $precedingListItemsOfSameStyle " / >
< xsl : with - param name = " precedingListItemsOfSameStyleCount " select = " $precedingListItemsOfSameStyleCount " / >
< xsl : with - param name = " pseudoLevel " select = " $pseudoLevel " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< ! - - NOT CONSECUTIVE NUMBERING - - >
< xsl : variable name = " currentListLevel " select = " count(ancestor::text:list) " / >
< xsl : choose >
< ! - - IF IT IS A HIGHER LIST LEVEL ELEMENT - - >
< xsl : when test = " $currentListLevel < $listLevel " >
< xsl : choose >
< ! - - if it has content the counting is ended - - >
< xsl : when test = " *[name() = 'text:h' or name() = 'text:p'] or $isListHeader " >
< ! - - 2DO : Perhaps the children still have to be processed - - >
< xsl : value - of select = " $itemNumber + $pseudoLevel " / >
< / xsl : when >
< xsl : otherwise >
< ! - - if it is empty the counting continues - - >
< xsl : call - template name = " countListItemTillStartValue " >
< xsl : with - param name = " IteratorSameLevelAndStyle " select = " $IteratorSameLevelAndStyle " / >
< xsl : with - param name = " IteratorSameStyle " select = " $IteratorSameStyle + 1 " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyleCount " select = " $precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " $precedingListItemsOfSameStyle " / >
< xsl : with - param name = " precedingListItemsOfSameStyleCount " select = " $precedingListItemsOfSameStyleCount " / >
< xsl : with - param name = " pseudoLevel " select = " $pseudoLevel " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< ! - - IF IT IS A LIST LEVEL ELEMENT OF THE COUNTING LEVEL - - >
< xsl : when test = " $currentListLevel = $listLevel " >
< xsl : call - template name = " countListItem " >
< xsl : with - param name = " IteratorSameLevelAndStyle " select = " $IteratorSameLevelAndStyle " / >
< xsl : with - param name = " IteratorSameStyle " select = " $IteratorSameStyle " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyleCount " select = " $precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " $precedingListItemsOfSameStyle " / >
< xsl : with - param name = " precedingListItemsOfSameStyleCount " select = " $precedingListItemsOfSameStyleCount " / >
< xsl : with - param name = " pseudoLevel " select = " $pseudoLevel " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< ! - - list item below the current level does not count - - >
< xsl : call - template name = " countListItemTillStartValue " >
< xsl : with - param name = " IteratorSameLevelAndStyle " select = " $IteratorSameLevelAndStyle " / >
< xsl : with - param name = " IteratorSameStyle " select = " $IteratorSameStyle + 1 " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyleCount " select = " $precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " $precedingListItemsOfSameStyle " / >
< xsl : with - param name = " precedingListItemsOfSameStyleCount " select = " $precedingListItemsOfSameStyleCount " / >
< xsl : with - param name = " pseudoLevel " >
< xsl : choose >
< ! - - empty list item does not count - - >
< xsl : when test = " not(*[name() = 'text:h' or name() = 'text:p']) or $isListHeader " >
< xsl : value - of select = " $pseudoLevel " / >
< / xsl : when >
< xsl : otherwise > 1 < / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : for - each >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $itemNumber " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template name = " countListItem " >
< xsl : param name = " IteratorSameLevelAndStyle " / >
< xsl : param name = " IteratorSameStyle " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listLevelStyle " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : param name = " precedingListItemsOfSameLevelAndStyle " / >
< xsl : param name = " precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : param name = " precedingListItemsOfSameStyle " / >
< xsl : param name = " precedingListItemsOfSameStyleCount " / >
< xsl : param name = " pseudoLevel " / >
< xsl : variable name = " isListHeader " select = " boolean(self::text:list-header) " / >
< xsl : variable name = " isEmptyList " select = " not(*[name() = 'text:h' or name() = 'text:p']) " / >
< xsl : choose >
< xsl : when test = " @text:start-value " >
< xsl : choose >
< xsl : when test = " $isEmptyList or $isListHeader " >
< ! - - empty list item does not count . neither does list header - - >
< xsl : call - template name = " countListItemTillStartValue " >
< xsl : with - param name = " IteratorSameLevelAndStyle " select = " $IteratorSameLevelAndStyle + 1 " / >
< xsl : with - param name = " IteratorSameStyle " select = " $IteratorSameStyle + 1 " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyleCount " select = " $precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " $precedingListItemsOfSameStyle " / >
< xsl : with - param name = " precedingListItemsOfSameStyleCount " select = " $precedingListItemsOfSameStyleCount " / >
< xsl : with - param name = " pseudoLevel " select = " $pseudoLevel " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $itemNumber + @text:start-value " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< xsl : when test = " $listLevelStyle/@text:start-value " >
< xsl : choose >
< xsl : when test = " $isEmptyList or $isListHeader " >
< ! - - empty list item does not count . neither does list header - - >
< xsl : call - template name = " countListItemTillStartValue " >
< xsl : with - param name = " IteratorSameLevelAndStyle " select = " $IteratorSameLevelAndStyle + 1 " / >
< xsl : with - param name = " IteratorSameStyle " select = " $IteratorSameStyle + 1 " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyleCount " select = " $precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " $precedingListItemsOfSameStyle " / >
< xsl : with - param name = " precedingListItemsOfSameStyleCount " select = " $precedingListItemsOfSameStyleCount " / >
< xsl : with - param name = " pseudoLevel " select = " $pseudoLevel " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $itemNumber + $listLevelStyle/@text:start-value " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : when >
< xsl : otherwise >
< xsl : choose >
< xsl : when test = " $isEmptyList or $isListHeader " >
< ! - - empty list item does not count . neither does list header - - >
< xsl : call - template name = " countListItemTillStartValue " >
< xsl : with - param name = " IteratorSameLevelAndStyle " select = " $IteratorSameLevelAndStyle + 1 " / >
< xsl : with - param name = " IteratorSameStyle " select = " $IteratorSameStyle + 1 " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyleCount " select = " $precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " $precedingListItemsOfSameStyle " / >
< xsl : with - param name = " precedingListItemsOfSameStyleCount " select = " $precedingListItemsOfSameStyleCount " / >
< xsl : with - param name = " pseudoLevel " select = " $pseudoLevel " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< ! - - count on till you find a start - value or the end is reached - - >
< xsl : call - template name = " countListItemTillStartValue " >
< xsl : with - param name = " IteratorSameLevelAndStyle " select = " $IteratorSameLevelAndStyle + 1 " / >
< xsl : with - param name = " IteratorSameStyle " select = " $IteratorSameStyle + 1 " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber + 1 " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyle " select = " $precedingListItemsOfSameLevelAndStyle " / >
< xsl : with - param name = " precedingListItemsOfSameLevelAndStyleCount " select = " $precedingListItemsOfSameLevelAndStyleCount " / >
< xsl : with - param name = " precedingListItemsOfSameStyle " select = " $precedingListItemsOfSameStyle " / >
< xsl : with - param name = " precedingListItemsOfSameStyleCount " select = " $precedingListItemsOfSameStyleCount " / >
< xsl : with - param name = " pseudoLevel " select = " 0 " / >
< / xsl : call - template >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< ! - - Creates the list label containing the number , which is separated by '.' between the levels .
Depending on the levels to display ( listLevelsToDisplay ) - - >
< xsl : template name = " createItemLabel " >
< xsl : param name = " itemLabel " select = " '' " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listLevelStyle " / >
< xsl : param name = " listLevelsToDisplay " / >
< xsl : choose >
< xsl : when test = " $listLevelsToDisplay < $listLevel " >
< xsl : call - template name = " truncLabel " >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listLevelsToDisplay " select = " $listLevelsToDisplay " / >
< / xsl : call - template >
< / xsl : when >
< xsl : otherwise >
< xsl : variable name = " numberedSymbol " >
< xsl : comment > & # 160 ; < / xsl : comment >
< ! - - only give out a number when number format is not empty - - >
< xsl : if test = " $listLevelStyle/@style:num-format != '' " >
< xsl : number value = " $itemNumber " format = " {$listLevelStyle/@style:num-format} " / >
< / xsl : if >
< / xsl : variable >
< xsl : choose >
< xsl : when test = " $listLevelsToDisplay != 1 " >
< xsl : value - of select = " concat($itemLabel, '.' , $numberedSymbol) " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $numberedSymbol " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template name = " truncLabel " >
< xsl : param name = " itemLabel " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listLevelStyle " / >
< xsl : param name = " listLevelsToDisplay " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : call - template name = " createItemLabel " >
< xsl : with - param name = " itemLabel " >
< xsl : if test = " contains($itemLabel, '.') " >
< xsl : value - of select = " substring-after($itemLabel, '.') " / >
< / xsl : if >
< / xsl : with - param >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLevel " select = " $listLevel - 1 " / >
< xsl : with - param name = " listLevelStyle " select = " $listLevelStyle " / >
< xsl : with - param name = " listLevelsToDisplay " select = " $listLevelsToDisplay " / >
< / xsl : call - template >
< / xsl : template >
< xsl : template match = " text:p " mode = " list-item-children " >
< xsl : param name = " globalData " / >
< xsl : param name = " listLabelElement " / >
< xsl : param name = " listLabelEmptyElement " / >
< xsl : param name = " isEmptyList " / >
< xsl : param name = " isListNumberingReset " / >
< xsl : param name = " isNextLevelNumberingReset " / >
< xsl : param name = " itemLabel " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " listIndent " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listRestart " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : param name = " minLabelWidth " / >
< ! - - 2DO page alignment fix - PART1 - - >
< ! - - xhtml : p may only contain inline elements .
If there is one frame beyond , div must be used ! - - >
< xsl : variable name = " elementName " >
< xsl : choose >
< xsl : when test = " descendant::draw:frame[1] or descendant::text:p[1] " > div < / xsl : when >
< xsl : otherwise > p < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : element name = " {$elementName} " >
< xsl : call - template name = " create-list-style " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< xsl : with - param name = " styleName " select = " @text:style-name " / >
< / xsl : call - template >
< xsl : choose >
< xsl : when test = " $listLabelElement " >
< xsl : copy - of select = " $listLabelElement " / >
< / xsl : when >
< xsl : otherwise >
< xsl : copy - of select = " $listLabelEmptyElement " / >
< / xsl : otherwise >
< / xsl : choose >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " listIndent " select = " $minLabelWidth " / >
< / xsl : apply - templates >
< ! - - this span disables the float necessary to bring two block elements on one line . It contains a space as IE6 bug workaround - - >
< span class = " odfLiEnd " ></span>
< xsl : text > & # 160 ; < / xsl : text >
< / xsl : element >
< xsl : apply - templates mode = " list-item-children " select = " following-sibling::*[1] " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLabelEmptyElement " select = " $listLabelEmptyElement " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< xsl : with - param name = " minLabelWidth " select = " $minLabelWidth " / >
< / xsl : apply - templates >
< / xsl : template >
< ! - - Neglecting the left margin behavior for headings for now - - >
< xsl : template match = " text:h " mode = " list-item-children " >
< xsl : param name = " globalData " / >
< xsl : param name = " listLabelElement " / >
< xsl : param name = " listLabelEmptyElement " / >
< xsl : param name = " isEmptyList " / >
< xsl : param name = " isListNumberingReset " / >
< xsl : param name = " isNextLevelNumberingReset " / >
< xsl : param name = " itemLabel " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " listIndent " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listRestart " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : param name = " minLabelWidth " / >
< xsl : element name = " h " >
< xsl : call - template name = " create-list-style " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< xsl : with - param name = " styleName " select = " @text:style-name " / >
< / xsl : call - template >
< xsl : variable name = " title " >
< xsl : apply - templates mode = " concatenate " / >
< / xsl : variable >
< xsl : choose >
< xsl : when test = " $listLabelElement " >
< xsl : copy - of select = " $listLabelElement " / >
< / xsl : when >
< xsl : otherwise >
< xsl : copy - of select = " $listLabelEmptyElement " / >
< / xsl : otherwise >
< / xsl : choose >
< ! - - REFERENCE HANDLING - ANCHOR - - >
< xsl : element namespace = " {$namespace} " name = " a " >
< xsl : attribute name = " id " >
< xsl : value - of select = " translate(concat('a_',$listLabelElement, '_', normalize-space($title)), '
&<>.,;: %()[]/ \ +', '___________________________') " / >
< / xsl : attribute >
< xsl : apply - templates >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " listIndent " select = " $minLabelWidth " / >
< / xsl : apply - templates >
< / xsl : element >
< ! - - this span disables the float necessary to bring two block elements on one line . It contains a space as IE6 bug workaround - - >
< span class = " odfLiEnd " ></span>
< xsl : text > & # 160 ; < / xsl : text >
< / xsl : element >
< xsl : apply - templates mode = " list-item-children " select = " following-sibling::*[1] " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLabelEmptyElement " select = " $listLabelEmptyElement " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< xsl : with - param name = " minLabelWidth " select = " $minLabelWidth " / >
< / xsl : apply - templates >
< / xsl : template >
< xsl : template match = " * " mode = " list-item-children " >
< xsl : param name = " globalData " / >
< xsl : param name = " isEmptyList " / >
< xsl : param name = " listLabelEmptyElement " / >
< xsl : param name = " isListNumberingReset " / >
< xsl : param name = " isNextLevelNumberingReset " / >
< xsl : param name = " itemLabel " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " listIndent " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listRestart " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : param name = " minLabelWidth " / >
< xsl : apply - templates select = " self::* " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " listLabelEmptyElement " select = " $listLabelEmptyElement " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< / xsl : apply - templates >
< xsl : apply - templates mode = " list-item-children " select = " following-sibling::*[1] " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listLabelEmptyElement " select = " $listLabelEmptyElement " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listRestart " select = " $listRestart " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< xsl : with - param name = " minLabelWidth " select = " $minLabelWidth " / >
< / xsl : apply - templates >
< / xsl : template >
< xsl : template match = " * " mode = " listItemSibling " >
< xsl : param name = " globalData " / >
< xsl : param name = " isEmptyList " / >
< xsl : param name = " isListNumberingReset " / >
< xsl : param name = " isNextLevelNumberingReset " / >
< xsl : param name = " itemLabel " / >
< xsl : param name = " itemNumber " / >
< xsl : param name = " listIndent " / >
< xsl : param name = " listLevel " / >
< xsl : param name = " listRestart " / >
< xsl : param name = " listStyle " / >
< xsl : param name = " listStyleName " / >
< xsl : apply - templates select = " self::* " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< ! - - receives the same parent label , only with a different itemNumber - - >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< / xsl : apply - templates >
< xsl : apply - templates select = " following-sibling::*[1] " mode = " listItemSibling " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " isEmptyList " select = " $isEmptyList " / >
< xsl : with - param name = " isListNumberingReset " select = " $isListNumberingReset " / >
< xsl : with - param name = " isNextLevelNumberingReset " select = " $isNextLevelNumberingReset " / >
< xsl : with - param name = " itemNumber " select = " $itemNumber " / >
< xsl : with - param name = " listIndent " select = " $listIndent " / >
< ! - - receives the same parent label , only with a different itemNumber - - >
< xsl : with - param name = " itemLabel " select = " $itemLabel " / >
< xsl : with - param name = " listLevel " select = " $listLevel " / >
< xsl : with - param name = " listStyle " select = " $listStyle " / >
< xsl : with - param name = " listStyleName " select = " $listStyleName " / >
< / xsl : apply - templates >
< / xsl : template >
< xsl : template match = " text() " mode = " list-item-children " >
< xsl : value - of select = " . " / >
< / xsl : template >
< xsl : template name = " create-list-style " >
< xsl : param name = " globalData " / >
< xsl : param name = " listIndent " select = " 0 " / >
< xsl : param name = " styleName " / >
< xsl : if test = " $styleName " >
< xsl : attribute name = " class " >
< xsl : value - of select = " translate($styleName, '.,;: %()[]/ \ +', '_____________') " / >
< / xsl : attribute >
< / xsl : if >
< xsl : attribute name = " style " >
< xsl : text > margin - < / xsl : text >
< xsl : call - template name = " getOppositeWritingDirection " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " paraStyleName " select = " descendant-or-self::*/@text:style-name " / >
< / xsl : call - template >
< xsl : text > : < / xsl : text >
< xsl : value - of select = " $listIndent " / >
< xsl : text > cm ; < / xsl : text >
< / xsl : attribute >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - - >
< ! - - * * * Text Section ( contains : draw : text - box ) * * * - - >
< ! - - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - - >
< xsl : template match = " text:section " >
< xsl : param name = " globalData " / >
< xsl : if test = " not(contains(@text:display, 'none')) " >
< xsl : comment > Next ' div ' was a ' text : section ' . < / xsl : comment >
< xsl : element name = " div " >
< xsl : call - template name = " apply-styles-and-content " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : call - template >
< / xsl : element >
< / xsl : if >
< / xsl : template >
< ! - - Hidden text dependent on Office variables :
The text is not shown , if condition is ' true ' .
Implemented solely for conditions as ' < VARIABLE > = = 0 ' or ' < VARIABLE > = = 1 '
- - >
< xsl : key match = " text:variable-set " name = " varSet " use = " @text:name " / >
< xsl : template match = " text:hidden-text " >
< xsl : param name = " globalData " / >
< xsl : variable name = " varName " select = " substring-before(@text:condition, '==') " / >
< xsl : variable name = " varValue " select = " substring-after(@text:condition, '==') " / >
< xsl : choose >
< xsl : when test = " key('varSet', $varName)/@text:value != $varValue " >
< xsl : value - of select = " @text:string-value " / >
< / xsl : when >
< xsl : otherwise >
< xsl : comment >
< xsl : value - of select = " $varName " / >
< xsl : value - of select = " @text:string-value " / >
< xsl : value - of select = " $varName " / >
< / xsl : comment >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
< xsl : template match = " @text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name " > < ! - - | @presentation : style - name - - >
< xsl : param name = " globalData " / >
< xsl : attribute name = " class " >
< xsl : value - of select = " translate(., '.,;: %()[]/ \ +', '_____________') " / >
< / xsl : attribute >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * * - - >
< ! - - * * * Footnotes * * * - - >
< ! - - * * * * * * * * * * * * * * * * * - - >
< xsl : template match = " text:note " >
< xsl : param name = " globalData " / >
< ! - - get style configuration - - >
< xsl : variable name = " footnoteConfig " select = " $globalData/office:styles/text:notes-configuration[@text:note-class=current()/@text:note-class] " / >
< xsl : variable name = " titlePrefix " >
< xsl : choose >
< xsl : when test = " @text:note-class = 'footnote' " >
< xsl : text > Footnote : < / xsl : text >
< / xsl : when >
< xsl : otherwise >
< xsl : text > Endnote : < / xsl : text >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< ! - - write anchor - - >
< xsl : element name = " span " >
< xsl : attribute name = " class " >
< xsl : value - of select = " $footnoteConfig/@text:citation-body-style-name " / >
< / xsl : attribute >
< xsl : attribute name = " title " >
< xsl : value - of select = " $titlePrefix " / >
< xsl : apply - templates mode = " textOnly " select = " text:note-body " / >
< / xsl : attribute >
< xsl : element name = " a " >
< xsl : attribute name = " href " >
< xsl : value - of select = " concat('#', @text:id) " / >
< / xsl : attribute >
< xsl : attribute name = " id " >
< xsl : value - of select = " concat('body_', @text:id) " / >
< / xsl : attribute >
< xsl : apply - templates mode = " textOnly " select = " text:note-citation " / >
< / xsl : element >
< / xsl : element >
< / xsl : template >
< xsl : template match = " * " mode = " textOnly " >
< xsl : apply - templates select = " * | text() " mode = " textOnly " / >
< / xsl : template >
< xsl : template match = " text() " mode = " textOnly " >
< xsl : value - of select = " . " / >
< / xsl : template >
< ! - - Useful in case of ' style : map ' , conditional formatting , where a style references to another - - >
< xsl : key name = " textNotes " match = " text:note " use = " @text:note-class " / >
< ! - - writing the footer - and endnotes beyond the body - - >
< xsl : template name = " write-text-nodes " >
< xsl : param name = " globalData " / >
< ! - - write footnote body - - >
< xsl : for - each select = " key('textNotes', 'footnote') " >
< xsl : call - template name = " write-text-node " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnoteConfig " select = " $globalData/office:styles/text:notes-configuration[@text:note-class=current()/@text:note-class] " / >
< / xsl : call - template >
< / xsl : for - each >
< ! - - write endnote body - - >
< xsl : for - each select = " key('textNotes', 'endnote') " >
< xsl : call - template name = " write-text-node " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnoteConfig " select = " $globalData/office:styles/text:notes-configuration[@text:note-class=current()/@text:note-class] " / >
< / xsl : call - template >
< / xsl : for - each >
< / xsl : template >
< xsl : template name = " write-text-node " >
< xsl : param name = " globalData " / >
< xsl : param name = " footnoteConfig " / >
< xsl : apply - templates select = " text:note-body/*[1] " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< xsl : with - param name = " footnotePrefix " >
< xsl : element name = " span " >
< xsl : attribute name = " class " > footnodeNumber < / xsl : attribute >
< xsl : element name = " a " >
< xsl : attribute name = " class " >
< xsl : value - of select = " $footnoteConfig/@text:citation-style-name " / >
< / xsl : attribute >
< xsl : attribute name = " id " >
< xsl : value - of select = " @text:id " / >
< / xsl : attribute >
< xsl : attribute name = " href " >
< xsl : value - of select = " concat('#body_', @text:id) " / >
< / xsl : attribute >
< xsl : apply - templates mode = " textOnly " select = " text:note-citation " / >
< / xsl : element >
< / xsl : element >
< / xsl : with - param >
< / xsl : apply - templates >
< xsl : apply - templates select = " text:note-body/*[position()>1] " >
< xsl : with - param name = " globalData " select = " $globalData " / >
< / xsl : apply - templates >
< / xsl : template >
< ! - - * * * * * * * * * * * * * * * * * - - >
< ! - - * * * Bookmarks * * * - - >
< ! - - * * * * * * * * * * * * * * * * * - - >
< xsl : template match = " text:bookmark|text:bookmark-start " >
< xsl : element name = " a " >
< xsl : attribute name = " id " >
< xsl : value - of select = " @text:name " / >
< / xsl : attribute >
< / xsl : element >
< / xsl : template >
< xsl : template match = " text:bookmark-end " / >
< ! - - DISABLING this tab handling as the tab width is only relative
< xsl : template match = " text:tab " >
< xsl : param name = " globalData " / >
< xsl : variable name = " tabNo " >
< xsl : choose >
< xsl : when test = " preceding-sibling::text:line-break " >
< xsl : call - template name = " countTextTab " / >
< / xsl : when >
< xsl : when test = " preceding-sibling::text:tab " >
< xsl : value - of select = " count(preceding-sibling::text:tab) " / >
< / xsl : when >
< xsl : otherwise > 1 < / xsl : otherwise >
< / xsl : choose >
< / xsl : variable >
< xsl : element name = " span " >
< xsl : attribute name = " style " > margin - left : < xsl : value - of select = " $globalData/all-doc-styles/style[@style:name = current()/parent::*/@text:style-name]/*/style:tab-stops/style:tab-stop[$tabNo]/@style:position " / > ; < / xsl : attribute >
< / xsl : element >
< / xsl : template >
< xsl : template name = " countTextTab " >
< xsl : param name = " tabCount " select = " 1 " / >
< xsl : param name = " context " select = " . " / >
< xsl : choose >
< xsl : when test = " preceding-sibling::*[1] " >
< xsl : for - each select = " preceding-sibling::*[1] " >
< xsl : call - template name = " countTextTab " >
< xsl : with - param name = " tabCout " >
< xsl : choose >
< xsl : when test = " name(.) = 'text:tab' " >
< xsl : value - of select = " $tabCount + 1 " / >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $tabCount " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : with - param >
< xsl : with - param name = " context " select = " preceding-sibling::*[1] " / >
< / xsl : call - template >
< / xsl : for - each >
< / xsl : when >
< xsl : otherwise >
< xsl : value - of select = " $tabCount " / >
< / xsl : otherwise >
< / xsl : choose >
< / xsl : template >
2019-04-15 10:23:03 +08:00
- - >
2021-06-23 10:26:22 +08:00
< ! - - MathML - - >
< xsl : template match = " draw:object[math:math] " >
< xsl : apply - templates select = " math:math " mode = " math " / >
< / xsl : template >
< xsl : template match = " * " mode = " math " >
< xsl : element name = " {local-name()} " namespace = " http://www.w3.org/1998/Math/MathML " >
< xsl : apply - templates select = " @*|node() " mode = " math " / >
< / xsl : element >
< / xsl : template >
< xsl : template match = " @* " mode = " math " >
< xsl : attribute name = " {local-name()} " >
< xsl : value - of select = " . " / >
< / xsl : attribute >
< / xsl : template >
< ! - - Ignore semantic annotations - - >
< xsl : template match = " math:semantics " mode = " math " >
< xsl : apply - templates select = " *[1] " mode = " math " / >
< / xsl : template >
2019-04-15 10:23:03 +08:00
< / xsl : stylesheet >