| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!--***********************************************************
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- ***********************************************************-->
- <!--
- For further documentation and updates visit http://xml.openoffice.org/odf2xhtml
- -->
- <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:java="http://xml.apache.org/xslt/java" xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder" 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 java urlencoder">
- <xsl:include href="table_of_content.xsl"/>
- <!-- ****************** -->
- <!-- *** Whitespace *** -->
- <!-- ****************** -->
- <xsl:template match="text:s">
- <xsl:call-template name="write-breakable-whitespace">
- <xsl:with-param name="whitespaces" select="@text:c"/>
- </xsl:call-template>
- </xsl:template>
- <!--write the number of 'whitespaces' -->
- <xsl:template name="write-breakable-whitespace">
- <xsl:param name="whitespaces"/>
- <!--write two space chars as the normal white space character will be stripped
- and the other is able to break -->
- <xsl:text> </xsl:text>
- <xsl:if test="$whitespaces >= 2">
- <xsl:call-template name="write-breakable-whitespace-2">
- <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
- </xsl:call-template>
- </xsl:if>
- </xsl:template>
- <!--write the number of 'whitespaces' -->
- <xsl:template name="write-breakable-whitespace-2">
- <xsl:param name="whitespaces"/>
- <!--write two space chars as the normal white space character will be stripped
- and the other is able to break -->
- <xsl:text> </xsl:text>
- <xsl:if test="$whitespaces >= 2">
- <xsl:call-template name="write-breakable-whitespace">
- <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
- </xsl:call-template>
- </xsl:if>
- </xsl:template>
- <!-- currentSolution: 8 non-breakable-spaces instead of a TAB is an approximation.
- Sometimes less spaces than 8 might be needed and the output might be more difficult to read-->
- <xsl:template match="text:tab">
- <xsl:param name="globalData"/>
- <xsl:call-template name="write-breakable-whitespace">
- <xsl:with-param name="whitespaces" select="8"/>
- </xsl:call-template>
- </xsl:template>
- <!-- *************** -->
- <!-- *** Textbox *** -->
- <!-- *************** -->
- <!-- ID / NAME of text-box -->
- <xsl:template match="@draw:name">
- <xsl:attribute name="id">
- <xsl:choose>
- <xsl:when test="number(substring(.,1,1))">
- <!-- Heuristic: If the first character is a number a 'a_' will be set
- as prefix, as id have to be of type NMTOKEN -->
- <xsl:value-of select="concat('a_',translate(., '
&<>.,;: %()[]/\+', '___________________________'))"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="translate(., '
&<>.,;: %()[]/\+', '___________________________')"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:template>
- <xsl:template match="text:line-break">
- <xsl:param name="listIndent"/>
- <xsl:element namespace="{$namespace}" name="br"/>
- <!-- line breaks in lists need an indent similar to the list label -->
- <xsl:if test="$listIndent">
- <xsl:element namespace="{$namespace}" name="span">
- <xsl:attribute name="style">margin-left:<xsl:value-of select="$listIndent"/>cm</xsl:attribute>
- </xsl:element>
- </xsl:if>
- </xsl:template>
- <!-- currently there have to be an explicit call of the style attribute nodes, maybe the attributes nodes have no priority only order relevant-->
- <xsl:template name="apply-styles-and-content">
- <xsl:param name="globalData"/>
- <xsl:param name="footnotePrefix" />
- <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"/>
- <xsl:apply-templates select="node()">
- <xsl:with-param name="globalData" select="$globalData"/>
- </xsl:apply-templates>
- </xsl:template>
- <!-- ******************* -->
- <!-- *** References *** -->
- <!-- ******************* -->
- <xsl:template match="text:reference-ref | text:sequence-ref">
- <xsl:param name="globalData"/>
- <xsl:element namespace="{$namespace}" name="a">
- <xsl:attribute name="href">
- <xsl:text>#</xsl:text>
- <xsl:choose>
- <xsl:when test="number(substring(@text:ref-name,1,1))">
- <!-- Heuristic: If the first character is a number a 'a_' will be set
- as prefix, as id have to be of type NMTOKEN -->
- <xsl:value-of select="concat('a_',translate(@text:ref-name, '
&<>.,;: %()[]/\+', '___________________________'))"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="translate(@text:ref-name, '
&<>.,;: %()[]/\+', '___________________________')"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <xsl:apply-templates select="@* | node()">
- <xsl:with-param name="globalData" select="$globalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:template>
- <xsl:template match="@text:name">
- <xsl:attribute name="id">
- <xsl:choose>
- <xsl:when test="number(substring(.,1,1))">
- <!-- Heuristic: If the first character is a number a 'a_' will be set
- as prefix, as id have to be of type NMTOKEN -->
- <xsl:value-of select="concat('a_',translate(., '
&<>.,;: %()[]/\+', '___________________________'))"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="translate(., '
&<>.,;: %()[]/\+', '___________________________')"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:template>
-
- <xsl:template match="text:sequence">
- <xsl:param name="globalData"/>
- <xsl:element namespace="{$namespace}" name="a">
- <xsl:apply-templates select="@*" />
- <xsl:attribute name="id">
- <xsl:choose>
- <xsl:when test="number(substring(@text:ref-name,1,1))">
- <!-- Heuristic: If the first character is a number a 'a_' will be set
- as prefix, as id have to be of type NMTOKEN -->
- <xsl:value-of select="concat('a_',translate(@text:ref-name, '
&<>.,;: %()[]/\+', '___________________________'))"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="translate(@text:ref-name, '
&<>.,;: %()[]/\+', '___________________________')"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:element>
- <xsl:apply-templates>
- <xsl:with-param name="globalData" select="$globalData"/>
- </xsl:apply-templates>
- </xsl:template>
- <xsl:template match="text:reference-mark">
- <xsl:param name="globalData"/>
- <xsl:element namespace="{$namespace}" name="a">
- <xsl:apply-templates select="@*" />
- <xsl:attribute name="id">
- <xsl:choose>
- <xsl:when test="number(substring(@text:name,1,1))">
- <!-- Heuristic: If the first character is a number a 'a_' will be set
- as prefix, as id have to be of type NMTOKEN -->
- <xsl:value-of select="concat('a_',translate(@text:name, '
&<>.,;: %()[]/\+', '___________________________'))"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="translate(@text:name, '
&<>.,;: %()[]/\+', '___________________________')"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:element>
- <xsl:apply-templates>
- <xsl:with-param name="globalData" select="$globalData"/>
- </xsl:apply-templates>
- </xsl:template>
- <xsl:template match="text:reference-mark-start">
- <xsl:param name="globalData"/>
- <xsl:element namespace="{$namespace}" name="a">
- <xsl:apply-templates select="@*" />
- </xsl:element>
- </xsl:template>
- <xsl:template match="text:bibliography-mark">
- <xsl:param name="globalData"/>
- <xsl:element namespace="{$namespace}" name="a">
- <xsl:apply-templates select="@* | node()">
- <xsl:with-param name="globalData" select="$globalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:template>
- <!-- @text:title exist only in text:bibliography-mark -->
- <xsl:template match="@text:title">
- <xsl:attribute name="title">
- <xsl:value-of select="."/>
- </xsl:attribute>
- </xsl:template>
- <!-- @text:url exist only in text:bibliography-mark -->
- <xsl:template match="@text:url">
- <xsl:attribute name="href">
- <xsl:value-of select="."/>
- </xsl:attribute>
- </xsl:template>
- <xsl:template match="text:user-defined">
- <xsl:apply-templates/>
- </xsl:template>
-
- <xsl:template match="office:annotation">
- <xsl:element name="span">
- <xsl:attribute name="title">annotation</xsl:attribute>
- <xsl:attribute name="class">annotation_style_by_filter</xsl:attribute>
- <xsl:apply-templates select="@*" />
- <br/>
- <xsl:text>[ANNOTATION:</xsl:text>
- <br/>
- <xsl:apply-templates select="*" mode="annotation"/>
- <xsl:text>]</xsl:text>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="text:p" mode="annotation">
- <br/>
- <xsl:element name="span">
- <xsl:text>NOTE: '</xsl:text>
- <xsl:apply-templates />
- <xsl:text>'</xsl:text>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="dc:creator" mode="annotation">
- <br/>
- <xsl:element name="span">
- <xsl:attribute name="title">dc:creator</xsl:attribute>
- <xsl:text>BY '</xsl:text>
- <xsl:apply-templates />
- <xsl:text>'</xsl:text>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="dc:date" mode="annotation">
- <br/>
- <xsl:element name="span">
- <xsl:attribute name="title">dc:date</xsl:attribute>
- <xsl:text>ON '</xsl:text>
- <xsl:apply-templates />
- <xsl:text>'</xsl:text>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="meta:date-string" mode="annotation">
- <br/>
- <xsl:element name="span">
- <xsl:attribute name="title">meta-date-string</xsl:attribute>
- <xsl:text>META DATE '</xsl:text>
- <xsl:apply-templates />
- <xsl:text>'</xsl:text>
- </xsl:element>
- </xsl:template>
-
-
- <!-- *************** -->
- <!-- *** HELPER *** -->
- <!-- *************** -->
- <xsl:template name="create-href">
- <xsl:param name="href"/>
- <xsl:choose>
- <!-- internal OOo URL used in content tables -->
- <xsl:when test="contains($href, '%7Coutline')">
- <!-- the simple workaround for content tables in a single document is to create create an anchor from every heading element
- work-around downside: Multiple identical headings won't refer always to the first.
- -->
- <xsl:text>#</xsl:text>
- <xsl:variable name="title">
- <xsl:apply-templates mode="concatenate"/>
- </xsl:variable>
- <xsl:value-of select="concat('a_', translate(normalize-space($title), '.,;: %()[]/\+', '_____________'))"/>
- </xsl:when>
- <xsl:when test="self::draw:image[office:binary-data]">
- <xsl:text>data:image/*;base64,</xsl:text><xsl:value-of select="office:binary-data"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:choose>
- <!-- in case of packed open office document -->
- <xsl:when test="starts-with($sourceBaseURL, 'jar:') or $isPackageFormat">
- <xsl:choose>
- <!-- for images relative to open office document -->
- <xsl:when test="starts-with($href, '../')">
- <!-- creating an absolute http URL to the packed image file (removing the '.')-->
- <xsl:value-of select="concat(substring-after(substring-before($sourceBaseURL, '!'), 'jar:'), '/', $href, $optionalURLSuffix)"/>
- </xsl:when>
- <!-- for absolute URLs & absolute paths -->
- <xsl:when test="contains($href, ':') or starts-with($href, '/')">
- <xsl:value-of select="concat($href, $optionalURLSuffix)"/>
- </xsl:when>
- <!-- for images jared in open office document -->
- <xsl:otherwise>
- <xsl:value-of select="concat($sourceBaseURL, $href, $optionalURLSuffix)"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:choose>
- <!-- for absolute URLs & Paths -->
- <xsl:when test="contains($href, ':') or starts-with($href, '/')">
- <xsl:value-of select="concat($href, $optionalURLSuffix)"/>
- </xsl:when>
- <!-- for relative URLs -->
- <xsl:otherwise>
- <xsl:value-of select="concat($sourceBaseURL, $href, $optionalURLSuffix)"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
- <xsl:template match="text()" mode="concatenate">
- <xsl:value-of select="."/>
- </xsl:template>
- <xsl:template match="*" mode="concatenate">
- <xsl:apply-templates mode="concatenate"/>
- </xsl:template>
- <!-- ******************** -->
- <!-- *** Common Rules *** -->
- <!-- ******************** -->
- <!-- ignore / neglect the following elements -->
- <xsl:template match="draw:custom-shape | draw:g | office:forms | text:alphabetical-index-mark | text:alphabetical-index-mark-end | text:alphabetical-index-mark-start | text:bibliography-source | text:number | text:reference-mark-end | text:sequence-decls | text:soft-page-break | text:table-of-content-source | text:tracked-changes | text:user-field-decls"/>
- <!-- default template used by purpose-->
- <xsl:template match="text:bibliography | text:change-end | text:change-start">
- <xsl:param name="globalData"/>
- <xsl:apply-templates>
- <xsl:with-param name="globalData" select="$globalData"/>
- </xsl:apply-templates>
- </xsl:template>
- <!-- default template for not recognized elements -->
- <xsl:template match="*">
- <xsl:param name="globalData"/>
- <xsl:message>Using default element rule for ODF element '<xsl:value-of select="name()"/>'.</xsl:message>
- <xsl:apply-templates>
- <xsl:with-param name="globalData" select="$globalData"/>
- </xsl:apply-templates>
- </xsl:template>
- <xsl:template match="@*"/>
- <!-- allowing all matched text nodes -->
- <xsl:template match="text()">
- <xsl:value-of select="."/>
- </xsl:template>
- </xsl:stylesheet>
|