You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by ed...@apache.org on 2005/10/26 10:30:29 UTC
svn commit: r328589 [2/5] - /lenya/trunk/src/modules/opendocument/xslt/
Added: lenya/trunk/src/modules/opendocument/xslt/global_document.xsl
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/modules/opendocument/xslt/global_document.xsl?rev=328589&view=auto
==============================================================================
--- lenya/trunk/src/modules/opendocument/xslt/global_document.xsl (added)
+++ lenya/trunk/src/modules/opendocument/xslt/global_document.xsl Wed Oct 26 01:30:13 2005
@@ -0,0 +1,1631 @@
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+ xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+ xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+ xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
+ xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
+ xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
+ xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
+ xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
+ xmlns:ooo="http://openoffice.org/2004/office"
+ xmlns:ooow="http://openoffice.org/2004/writer"
+ xmlns:oooc="http://openoffice.org/2004/calc"
+ xmlns:dom="http://www.w3.org/2001/xml-events"
+ xmlns:xforms="http://www.w3.org/2002/xforms"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ extension-element-prefixes="xt"
+ xmlns:sxghelper="http://www.jclark.com/xt/java/com.sun.star.xslt.helper.SxgChildTransformer"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+ <xsl:output method ="xml"
+ encoding ="UTF-8"
+ indent ="yes"/>
+
+
+
+
+ <!-- ********************************************** -->
+ <!-- *** Global Document - Table of Content *** -->
+ <!-- ********************************************** -->
+
+
+
+ <xsl:template match="text:table-of-content">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
+
+
+ <xsl:template match="text:index-body">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:apply-templates mode="content-table">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
+
+
+ <xsl:template match="text:index-title" mode="content-table">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
+ <xsl:template match="text:reference-ref">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+ <xsl:if test="not($isJavaDisabled)">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="encode-string">
+ <!-- the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT-->
+ <xsl:with-param name="textToBeEncoded" select="@text:ref-name"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="text:reference-mark">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+ <xsl:if test="not($isJavaDisabled)">
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:call-template name="encode-string">
+ <!-- the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT-->
+ <xsl:with-param name="textToBeEncoded" select="@text:name"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+
+
+ <xsl:template match="text:reference-mark-start">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+ <xsl:if test="not($isJavaDisabled)">
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:call-template name="encode-string">
+ <!-- the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT-->
+ <xsl:with-param name="textToBeEncoded" select="@text:name"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:variable name="endOfReference">
+ <xsl:for-each select="text:reference-mark-end[@name=current()/@text:name]">
+ <xsl:value-of select="position()"/>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:for-each select="following-sibling::*[position() < $endOfReference]">
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+
+
+
+ <!-- content table link -->
+ <xsl:template match="text:a" mode="content-table">
+ <xsl:param name="collectedGlobalData"/>
+
+
+ <!-- For anchors in content-headers a bug exists (cp. bug id# 102311) and they have to be worked out separately.
+ Currently the link used in the content-table of an Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
+ is not a valid URL (cp. bug id# 102311). No file destination is specified nor exist any anchor element for these
+ links in the Office XML, nor is the chapter no. known in the linked files.
+ A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
+ can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
+ All header titles gonna be encoding to be usable in a relative URL. -->
+ <xsl:choose>
+ <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled">
+ <xsl:call-template name="create-common-link">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="create-content-table-link">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="get-absolute-chapter-no">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="precedingChapterLevel1"/>
+
+ <xsl:choose>
+ <xsl:when test="$globalDocumentRefToCurrentFile">
+
+ <xsl:variable name="currentFileHeadingNo">
+ <xsl:call-template name="get-current-file-heading-no"/>
+ </xsl:variable>
+ <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
+
+ <xsl:call-template name="get-global-heading-no">
+ <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
+ <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
+ </xsl:call-template>
+
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
+ work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
+ <xsl:variable name="currentFileHeadingNo">
+ <xsl:call-template name="get-current-file-heading-no"/>
+ </xsl:variable>
+ <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
+
+ <xsl:call-template name="get-global-heading-no">
+ <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
+ <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="get-current-file-heading-no">
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-current-child-heading-no')">
+ <xsl:value-of select="sxghelper:get-current-child-heading-no()"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo()"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="get-next-current-file-heading-no">
+ <xsl:param name="file"/>
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-next-current-child-heading-no')">
+ <xsl:value-of select="sxghelper:get-next-current-child-heading-no($file)"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo($file)"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="get-global-heading-no">
+ <xsl:param name="currentFileHeadingNo"/>
+ <xsl:param name="precedingChapterLevel1"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-global-heading-no')">
+ <xsl:value-of select="sxghelper:get-global-heading-no(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+ <!-- necessary as anchor for the content table -->
+ <xsl:template name="create-heading-anchor">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!--
+ Currently the link used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
+ is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
+ links in the Office XML.
+ Here we are creating an anchor with the space normalized text of this header as potential jump address of the content table -->
+
+ <xsl:choose>
+ <xsl:when test="$globalDocumentRefToCurrentFile">
+
+ <xsl:variable name="currentFileHeadingNo">
+ <xsl:call-template name="get-next-current-file-heading-no">
+ <xsl:with-param name="file" select="$globalDocumentRefToCurrentFile"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
+ <xsl:if test="$isDebugMode">
+ <xsl:message>Matching child document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
+ <xsl:message>absolute-chapter-level: <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
+ <xsl:message>encodedTitle: <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
+ <xsl:message>globalDocumentRefToCurrentFile: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
+ <xsl:message>*** </xsl:message>
+ </xsl:if>
+
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$testResult/@absolute-chapter-level"/>
+ <xsl:text>+</xsl:text>
+ <xsl:value-of select="$testResult/@encoded-title"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
+ work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
+ <xsl:variable name="currentFileHeadingNo">
+ <xsl:call-template name="get-next-current-file-heading-no">
+ <xsl:with-param name="file" select="$contentTableURL"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>Matching global document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
+ <xsl:message>absolute-chapter-level: <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
+ <xsl:message>encodedTitle: <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
+ <xsl:message>contentTableURL: <xsl:value-of select="$contentTableURL"/></xsl:message>
+ <xsl:message>*** </xsl:message>
+ </xsl:if>
+
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$testResult/@absolute-chapter-level"/>
+ <xsl:text>+</xsl:text>
+ <xsl:value-of select="$testResult/@encoded-title"/>
+ </xsl:attribute>
+ </xsl:element>
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+
+<!--
+
+ <xsl:variable name="title" select="normalize-space(.)"/>
+ <!~~DON'T WORK <xsl:variable name="title" select="normalize-space(descendant::text())"/> ~~>
+ <xsl:choose>
+ <xsl:when test="$globalDocumentRefToCurrentFile">
+ <xsl:variable name="testResults" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][$title = @title][current()/@text:level = @level]"/>
+ <xsl:if test="1 < count($testResults)">
+ <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
+ <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
+ <xsl:choose>
+ <xsl:when test="$encodedTitle">
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$encodedTitle"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!~~ even when it is not ~~>
+ <xsl:variable name="newEncodedTitle">
+ <xsl:call-template name="encode-string">
+ <!~~ the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT~~>
+ <xsl:with-param name="textToBeEncoded" select="$title"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$newEncodedTitle"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="testResults" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][$title = @title][current()/@text:level = @level]"/>
+ <xsl:if test="1 < count($testResults)">
+ <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
+ <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
+ <xsl:message> *** </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
+ <xsl:choose>
+ <xsl:when test="$encodedTitle">
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$encodedTitle"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!~~ even when it is not ~~>
+ <xsl:variable name="newEncodedTitle">
+ <xsl:call-template name="encode-string">
+ <!~~ the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT~~>
+ <xsl:with-param name="textToBeEncoded" select="$title"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$newEncodedTitle"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+-->
+
+ </xsl:template>
+
+
+
+
+ <!-- ************************************** -->
+ <!-- CREATION OF A CONTENT TABLE LINK -->
+ <!-- ************************************** -->
+
+
+ <!-- a special behavior of text:a
+ (called from the 'text:a' template) -->
+
+ <xsl:template name="create-content-table-link">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <xsl:when test="not($outputType = 'WML')">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="starts-with(@xlink:href, '#')">
+ <xsl:variable name="correctHeading" select="$collectedGlobalData/content-table-headings/heading[current()/@xlink:href = @content-table-id]"/>
+
+ <xsl:value-of select="$correctHeading/@out-file-url"/>
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="$correctHeading/@absolute-chapter-level"/>
+ <xsl:text>+</xsl:text>
+ <xsl:value-of select="$correctHeading/@encoded-title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="create-common-link">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- 2DO: currently no WML support
+
+ <!~~ no nested p tags in wml1.1 allowed ~~>
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <xsl:element name="a">
+ <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ <xsl:apply-templates select="."/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:element name="a">
+ <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ <xsl:apply-templates select="."/>
+ </xsl:element>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose> -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!--
+ CREATION OF A HELPER VARIABLE AS WORKAROUND FOR THE CONTENT TABLE ULR BUG
+
+
+ As no valid URL from the content table to the child documents exist in the content table,
+ a work-around is done:
+
+ First two helper variables are being created.
+
+ One containing the list of all references of the global document:
+ containg all their title,
+ for example:
+
+ <chapter-ref title="aTitle 1"/>
+ <chapter-ref title="aTitle 2"/>
+ <chapter-ref title="aTitle 2/>
+ <chapter-ref title="aTitle 3/>
+
+ The other containing all heading from the child documents linked from the global document.
+ The variable 'childrenHeadings' contains their title and the number of preceding similar titles,
+ for example:
+
+
+ <child file-url="aURL">
+ <heading title="aTitle1" level="1">
+ <heading title="aTitle2" level="2">
+ <heading title="aTitle3" level="1">
+ </child>
+
+ For each chapter reference from the content table the
+
+ by encoding the chapter names of the child document with the java URLEncoder and
+ use this as a part of a link. Furthermore for all heading elements a encoded anchor will be created from the heading.
+ Last the workaround parses all children documents for this anhor, as there is no distinction of files from the content table entries.
+
+ The new added node set to the collectedGlobalData variable concering the content table is written as
+
+
+ <content-table-headings content-table-url="aURL_ToTheGeneratedContentTable">
+ <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
+ <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
+ <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
+ <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
+ </content-table-headings>
+
+
+ Preconditions:
+ The correct sequence of child documents according to the Content Table is necessary, granted by the office.
+ -->
+ <xsl:template name="Create-helper-variables-for-Content-Table">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the content table....</xsl:message></xsl:if>
+
+ <!-- Here a helper variable of the content table is created, of all chapter-references which point to a child document.
+ an 'chapter-ref' element will be created, containg their title and the number of preceding similar titles,
+ for example:
+
+ <chapter-ref title="aTitle 1"/>
+ <chapter-ref title="aTitle 2"/>
+ <chapter-ref title="aTitle 2"/>
+ <chapter-ref title="aTitle 3"/>
+ -->
+ <xsl:variable name="chapterRefs-RTF">
+ <!-- '/*/' as the flat and the zipped XML file format have different root elements -->
+ <xsl:for-each select="/*/office:body/text:table-of-content/text:index-body/text:p/text:a">
+ <xsl:variable name="currentTitle" select="normalize-space(string(.))"/>
+ <xsl:element name="chapter-ref">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$currentTitle"/>
+ </xsl:attribute>
+ <xsl:attribute name="content-table-id">
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the content table!</xsl:message></xsl:if>
+
+
+
+
+ <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the child documents....</xsl:message></xsl:if>
+ <!-- Here a helper variable of created from the children documents.
+ Containg all heading elements from the child documents. Some or all of them are
+ chapters referenced by the Global Document.
+ The variable contains their title, the level of the heading and the file URL of the child,
+ for example:
+
+ <heading title="aTitle1" level="1" file-url="aURL1">
+ <heading title="aTitle2" level="2" file-url="aURL1">
+ <heading title="aTitle3" level="1" file-url="aURL1">
+ <heading title="aTitle4" level="1" file-url="aURL2">
+ <heading title="aTitle5" level="2" file-url="aURL2">
+ <heading title="aTitle2" level="3" file-url="aURL2">
+ <heading title="aTitle6" level="3" file-url="aURL2">
+ <heading-count>7</heading-count>
+ -->
+ <xsl:variable name="childrenHeadings-RTF">
+ <!-- all headers from children documents will be added -->
+ <xsl:apply-templates select="/*/office:body/text:section" mode="creation-of-variable"/>
+ </xsl:variable>
+ <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the child documents!</xsl:message></xsl:if>
+
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:call-template name="Create-global-variable-for-Content-Table">
+ <xsl:with-param name="chapterRefs" select="xt:node-set($chapterRefs-RTF)"/>
+ <xsl:with-param name="childrenHeadings" select="xt:node-set($childrenHeadings-RTF)"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:call-template name="Create-global-variable-for-Content-Table">
+ <xsl:with-param name="chapterRefs" select="xalan:nodeset($chapterRefs-RTF)"/>
+ <xsl:with-param name="childrenHeadings" select="xalan:nodeset($childrenHeadings-RTF)"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+ <xsl:template name="Create-global-variable-for-Content-Table">
+ <xsl:param name="chapterRefs"/>
+ <xsl:param name="childrenHeadings"/>
+ <xsl:param name="collectedGlobalData"/>
+
+
+ <xsl:if test="$isDebugMode">
+ <!-- helper variable collecting all headings from the global document file children-->
+ <xsl:for-each select="$childrenHeadings/heading">
+ <xsl:message># <xsl:value-of select="position()"/></xsl:message>
+ <xsl:message>level: <xsl:value-of select="@level"/></xsl:message>
+ <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
+ <xsl:message>encoded-title: <xsl:value-of select="@encoded-title"/></xsl:message>
+ <xsl:message>file-url: <xsl:value-of select="@file-url"/></xsl:message>
+ <xsl:message>header-no: <xsl:value-of select="@header-no"/></xsl:message>
+ <xsl:message>**</xsl:message>
+ </xsl:for-each>
+ <xsl:message>**</xsl:message>
+ <xsl:message>**</xsl:message>
+
+ <!-- helper variable collecting all heading references from the content table of the the global document -->
+ <xsl:message>childrenHeadings/heading-count: <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
+ <xsl:for-each select="$chapterRefs/chapter-ref">
+ <xsl:message># <xsl:value-of select="position()"/></xsl:message>
+ <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
+ <xsl:message>**</xsl:message>
+ </xsl:for-each>
+ </xsl:if>
+
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:set-heading-no')">
+ <xsl:value-of select="sxghelper:set-heading-no(1)"/>
+ <xsl:value-of select="sxghelper:set-current-child-no(1)"/>
+ <xsl:value-of select="sxghelper:set-current-child-url(string($childrenHeadings/heading/@file-url))"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo(1)"/>
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo(1)"/>
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl(string($childrenHeadings/heading/@file-ur))"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$isDebugMode"><xsl:message>Creating global document variable for chapter relations....</xsl:message></xsl:if>
+ <xsl:variable name="contentTableHeadingsGlobalData-RTF">
+ <xsl:element name="content-table-headings">
+ <!-- all headings are linked from the current global document input file -->
+ <xsl:attribute name="content-table-url">
+ <xsl:value-of select="$contentTableURL"/>
+ </xsl:attribute>
+
+ <!-- had to use a for loop, as a recursion ends with an stackoverflow exception after about 600 recursive calls -->
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-heading-no')">
+ <xsl:for-each select="$chapterRefs/chapter-ref">
+ <xsl:call-template name="searchHeadingInChildDocument">
+ <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
+ <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
+ <xsl:with-param name="currentChapterRefNo" select="position()"/>
+ <xsl:with-param name="currentHeadingNo" select="sxghelper:get-heading-no()"/>
+ <xsl:with-param name="currentChildURL" select="sxghelper:get-current-child-url()"/>
+ <xsl:with-param name="currentChildNo" select="sxghelper:get-current-child-no()"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo')">
+ <xsl:for-each select="$chapterRefs/chapter-ref">
+ <xsl:call-template name="searchHeadingInChildDocument">
+ <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
+ <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
+ <xsl:with-param name="currentChapterRefNo" select="position()"/>
+ <xsl:with-param name="currentHeadingNo" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo()"/>
+ <xsl:with-param name="currentChildURL" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildUrl()"/>
+ <xsl:with-param name="currentChildNo" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildNo()"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:element>
+
+ <!-- adding the already exisiting global data environment -->
+ <xsl:copy-of select="$collectedGlobalData"/>
+ </xsl:variable>
+ <xsl:if test="$isDebugMode"><xsl:message>Finished global document variable for chapter relations!</xsl:message></xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:call-template name="start-self-and-children-transformation">
+ <xsl:with-param name="collectedGlobalData" select="xt:node-set($contentTableHeadingsGlobalData-RTF)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:call-template name="start-self-and-children-transformation">
+ <xsl:with-param name="collectedGlobalData" select="xalan:nodeset($contentTableHeadingsGlobalData-RTF)"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="searchHeadingInChildDocument">
+ <xsl:param name="chapterRefs"/>
+ <xsl:param name="childrenHeadings"/>
+ <xsl:param name="currentChapterRefNo"/>
+ <xsl:param name="currentHeadingNo"/>
+ <xsl:param name="currentChildURL"/>
+ <xsl:param name="currentChildNo"/>
+
+
+ <xsl:variable name="currentChapterRef" select="$chapterRefs/chapter-ref[$currentChapterRefNo]"/>
+ <xsl:variable name="currentChapterID" select="$currentChapterRef/@content-table-id"/>
+ <xsl:variable name="currentChapterTitle" select="$currentChapterRef/@title"/>
+
+ <xsl:variable name="currentChildHeading" select="$childrenHeadings/heading[$currentHeadingNo]"/>
+ <xsl:variable name="headingTitle" select="$currentChildHeading/@title"/>
+ <xsl:variable name="headingLevel" select="$currentChildHeading/@level"/>
+ <xsl:variable name="headingNo" select="$currentChildHeading/@header-no"/>
+ <xsl:variable name="newChildURL" select="$currentChildHeading/@file-url"/>
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>*** new heading </xsl:message>
+ <xsl:message>currentChapterID: <xsl:value-of select="$currentChapterID"/></xsl:message>
+ <xsl:message>currentChapterTitle: <xsl:value-of select="$currentChapterTitle"/></xsl:message>
+ <xsl:message>currentChapterID: <xsl:value-of select="$currentChapterID"/></xsl:message>
+ <xsl:message>currentHeadingNo: <xsl:value-of select="$currentHeadingNo"/></xsl:message>
+ <xsl:message>headingTitle: <xsl:value-of select="$headingTitle"/></xsl:message>
+ <xsl:message>headingLevel: <xsl:value-of select="$headingLevel"/></xsl:message>
+ <xsl:message>headingNo: <xsl:value-of select="$headingNo"/></xsl:message>
+ <xsl:message>newChildURL: <xsl:value-of select="$newChildURL"/></xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="outFileURL">
+ <xsl:choose>
+ <xsl:when test="substring-before($newChildURL,'.xml')">
+ <xsl:value-of select="concat(substring-before($newChildURL,'.xml'),'.htm')"/>
+ </xsl:when>
+ <xsl:when test="substring-before($newChildURL,'.sx')">
+ <xsl:value-of select="concat(substring-before($newChildURL,'.sx'),'.htm')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="isChapterHeading" select="$headingTitle = $currentChapterTitle"/>
+ <xsl:variable name="isNewFile" select="string($newChildURL) != string($currentChildURL)"/>
+
+
+
+
+ <xsl:if test="$isNewFile">
+ <!-- reset of the already collected child headers -->
+ <xsl:call-template name="calc-chapter-numbers">
+ <xsl:with-param name="level" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:variable name="absoluteChapterLevel">
+ <xsl:call-template name="calc-chapter-numbers">
+ <xsl:with-param name="level" select="number($headingLevel)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:element name="heading">
+ <!-- necessary to as ID from the content table to get the correct heading element (the buggy URL used as ID)-->
+ <xsl:attribute name="content-table-id">
+ <xsl:choose>
+ <xsl:when test="$isChapterHeading">
+ <xsl:value-of select="$currentChapterID"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>only a heading, but not a chapter</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <!-- no of the used child, necessary for quick finding of chapters of next file -->
+ <xsl:attribute name="child-document-no">
+ <xsl:choose>
+ <xsl:when test="$isNewFile">
+ <xsl:value-of select="$currentChildNo + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$currentChildNo"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <!-- the URL of the child document source, containing the heading -->
+ <xsl:attribute name="file-url">
+ <xsl:value-of select="$newChildURL"/>
+ </xsl:attribute>
+ <xsl:attribute name="out-file-url">
+ <xsl:value-of select="$outFileURL"/>
+ </xsl:attribute>
+ <xsl:attribute name="level">
+ <xsl:value-of select="$headingLevel"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$headingTitle"/>
+ </xsl:attribute>
+ <xsl:attribute name="encoded-title">
+ <xsl:value-of select="$currentChildHeading/@encoded-title"/>
+ </xsl:attribute>
+ <xsl:attribute name="absolute-chapter-level">
+ <xsl:value-of select="$absoluteChapterLevel"/>
+ </xsl:attribute>
+ </xsl:element>
+
+
+ <xsl:choose>
+ <xsl:when test="$childrenHeadings/heading-count != $currentHeadingNo">
+ <!-- procede as long the list of children isn'nt worked through -->
+ <xsl:choose>
+ <xsl:when test="$isChapterHeading">
+ <!-- global variables have to be set, so the for-each loop can access them -->
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:set-heading-no')">
+ <xsl:value-of select="sxghelper:set-heading-no($currentHeadingNo + 1)"/>
+ <xsl:if test="$isNewFile">
+ <xsl:value-of select="sxghelper:set-current-child-no($currentChildNo + 1)"/>
+ <xsl:value-of select="sxghelper:set-current-child-url(string($newChildURL))"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo($currentHeadingNo + 1)"/>
+ <xsl:if test="$isNewFile">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo($currentChildNo + 1)"/>
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl($newChildURL)"/>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- not a chapter heading, call itself until a chapter ref is found or the end of headings is reached -->
+ <xsl:call-template name="searchHeadingInChildDocument">
+ <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
+ <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
+ <xsl:with-param name="currentChapterRefNo" select="$currentChapterRefNo"/>
+ <xsl:with-param name="currentHeadingNo" select="$currentHeadingNo + 1"/>
+ <xsl:with-param name="currentChildURL" select="$currentChildURL"/>
+ <xsl:with-param name="currentChildNo" select="$currentChildNo"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$isDebugMode">
+ <xsl:message>All child documents have been walked through without finding the chapter name!</xsl:message>
+ <xsl:message> childrenHeadings/heading-count: <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
+ <xsl:message> currentHeadingNo: <xsl:value-of select="$currentHeadingNo"/></xsl:message>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+
+ <!-- Chapters from the Content Table have currently no anchor to child documents in OOo XML.
+ As solution, whenever a a global document every header of the HTML output gets get's an anchor in the Therefore-->
+ <xsl:template name="encode-string">
+ <xsl:param name="encoding" select="'UTF-8'"/>
+ <xsl:param name="textToBeEncoded"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('urlencoder:encode')">
+ <xsl:value-of select="urlencoder:encode(normalize-space($textToBeEncoded),$encoding)"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:java.net.URLEncoder.encode')">
+ <xsl:value-of select="java:java.net.URLEncoder.encode(string(normalize-space($textToBeEncoded)),string($encoding))"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+
+ <!-- ******************************************************************************************************** -->
+ <!-- *** TRANSFORMATION OF ALL CHILD DOCUMENTS OF THE GLOBAL DOCUMENTS BY USING A EXTERNAL HELPER CLASS *** -->
+ <!-- ******************************************************************************************************** -->
+
+
+ <!-- a new element 'contentTableHeadings' will be added to the helper variable the first time a child will be transformed -->
+ <xsl:template name="transform-global-document-and-children">
+ <xsl:param name="collectedGlobalData"/>
+
+
+ <xsl:choose>
+ <xsl:when test="$collectedGlobalData/content-table-headings">
+ <xsl:call-template name="start-child-transformation">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- The necessary auxiliary variable hasn't build yet.
+ This variable gonna store all headers (with chapter numbers) and the URL of their files -->
+
+ <xsl:call-template name="Create-helper-variables-for-Content-Table">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="start-self-and-children-transformation">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:if test="$isDebugMode">
+ <xsl:call-template name="debug-content-table-headings-variable">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+
+ <xsl:message>Parsing the global document...</xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+
+ <xsl:if test="$isDebugMode"><xsl:message>Parsing the child documents...</xsl:message></xsl:if>
+ <xsl:call-template name="start-child-transformation">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+
+ </xsl:template>
+
+
+
+
+ <xsl:template name="start-child-transformation">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:if test="$isDebugMode"><xsl:message>Starting the child transformations...</xsl:message></xsl:if>
+
+ <!-- As the childs of a global document (with suffix .sxg) do not know anything about their global parent,
+ the transformation of global documents children have to be done implizit.
+ Otherwise the chapter number of the children will always start with zero, as they do not know anything about the
+ proceding chapters.
+ Furthermore, they don't have any links about preceeding and following documents and no linking for usability reasons
+ could be done. Therefore the children have to be transformed during the transformation of a global (sxg) document -->
+ <xsl:if test="$isDebugMode">
+ <xsl:choose>
+ <xsl:when test="$collectedGlobalData/content-table-headings">
+ <xsl:message>Contentable data exists as global data!</xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>No Contentable global data exists!</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <!-- currently this function only works with node-sets from XT -->
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:transform-children')">
+ <xsl:message>
+ <xsl:value-of select="sxghelper:transform-children( $collectedGlobalData/content-table-headings,
+ string($jaredRootURL),
+ string($absoluteSourceDirRef),
+ string($optionalURLSuffix),
+ string($dpi),
+ string($outputType),
+ $isDebugMode)"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>Java method transformChildren to transform all children of a global document could not be found. Be sure to use the XT processor.</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+
+ <!-- ******************************************************************************* -->
+ <!-- *** Creation of helper variable of the headings of all children documents *** -->
+ <!-- ******************************************************************************* -->
+
+
+ <xsl:template match="/*/office:body/text:section" mode="creation-of-variable">
+ <xsl:call-template name="getChildRootNode"/>
+
+ <!-- after the last child document the global document will be parsed -->
+ <xsl:if test="position() = last()">
+ <!-- search the global document after all child documents have been searched
+
+ODK PATCH NO INDEX ELEMENT WANTED !! - null pointer exception
+ <xsl:call-template name="getPreviousHeaderNo">
+ <xsl:with-param name="fileURL" select="$contentTableURL"/>
+ <xsl:with-param name="amountOfCurrentHeading" select="count(following-sibling::text:h)"/>
+ <xsl:with-param name="nodeToSearchForHeading" select="following-sibling::text:h"/>
+ </xsl:call-template>
+-->
+ <!-- get the overall No of Headers -->
+ <xsl:call-template name="getAllHeaderNo"/>
+ </xsl:if>
+ </xsl:template>
+
+
+ <xsl:template name="getChildRootNode">
+ <xsl:variable name="fileURL" select="text:section-source/@xlink:href"/>
+
+ <xsl:choose>
+ <!-- if absolute URL or absolute DOS PATH or absolute Unix path -->
+ <xsl:when test="contains($fileURL,'//') or (substring($fileURL,2,1) = ':') or starts-with($fileURL, '/')">
+ <xsl:variable name="childRootNode" select="document($fileURL)"/>
+ <xsl:call-template name="getPreviousHeaderNo">
+ <xsl:with-param name="fileURL" select="$fileURL"/>
+ <!-- NO absolute source path will be added as prefix -->
+ <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
+ <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="childRootNode" select="document(concat($absoluteSourceDirRef,'/',$fileURL))"/>
+ <xsl:call-template name="getPreviousHeaderNo">
+ <xsl:with-param name="fileURL" select="$fileURL"/>
+ <!-- the absolute source path will be added as prefix -->
+ <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
+ <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="getPreviousHeaderNo">
+ <xsl:param name="fileURL"/>
+ <xsl:param name="nodeToSearchForHeading"/>
+ <xsl:param name="amountOfCurrentHeading"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-previous-child-documents-heading-count')">
+ <xsl:call-template name="addHeadingInfo">
+ <xsl:with-param name="nodeToSearchForHeading" select="$nodeToSearchForHeading"/>
+ <xsl:with-param name="fileURL" select="$fileURL"/>
+ <xsl:with-param name="previousHeader" select="sxghelper:get-previous-child-documents-heading-count($amountOfCurrentHeading)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount')">
+ <xsl:call-template name="addHeadingInfo">
+ <xsl:with-param name="nodeToSearchForHeading" select="$nodeToSearchForHeading"/>
+ <xsl:with-param name="fileURL" select="$fileURL"/>
+ <xsl:with-param name="previousHeader" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount($amountOfCurrentHeading)"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+ <xsl:template name="addHeadingInfo">
+ <xsl:param name="fileURL"/>
+ <xsl:param name="previousHeader"/>
+ <xsl:param name="nodeToSearchForHeading"/>
+
+ <xsl:variable name="previousHeader2" select="number($previousHeader)"/>
+ <xsl:for-each select="$nodeToSearchForHeading">
+
+ <xsl:variable name="title" select="normalize-space(.)"/>
+
+ <xsl:variable name="encodedTitle">
+ <xsl:call-template name="encode-string">
+ <!-- the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT-->
+ <xsl:with-param name="textToBeEncoded" select="$title"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:element name="heading">
+ <!-- odd but 'descendant:text()' didn't work, but '.', to get all text nodes of the header -->
+ <xsl:attribute name="title"><xsl:value-of select="$title"/></xsl:attribute>
+ <xsl:attribute name="encoded-title"><xsl:value-of select="$encodedTitle"/></xsl:attribute>
+ <xsl:attribute name="level"><xsl:value-of select="@text:level"/></xsl:attribute>
+ <xsl:attribute name="file-url"><xsl:value-of select="$fileURL"/></xsl:attribute>
+ <xsl:attribute name="header-no"><xsl:value-of select="position() + $previousHeader2"/></xsl:attribute>
+ </xsl:element>
+ </xsl:for-each>
+
+ </xsl:template>
+
+
+ <xsl:template name="getAllHeaderNo">
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-all-child-documents-heading-count')">
+ <xsl:call-template name="addAllHeaderNoElement">
+ <xsl:with-param name="allHeader" select="sxghelper:get-all-child-documents-heading-count()"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount')">
+ <xsl:call-template name="addAllHeaderNoElement">
+ <xsl:with-param name="allHeader" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount()"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="addAllHeaderNoElement">
+ <xsl:param name="allHeader"/>
+
+ <xsl:element name="heading-count">
+ <xsl:value-of select="$allHeader"/>
+ </xsl:element>
+
+ </xsl:template>
+
+
+ <!-- ******************************************************************************************************* -->
+ <!-- *** Creation of a line of links at the beginning and end of a child document to enhance usability *** -->
+ <!-- ******************************************************************************************************* -->
+
+ <xsl:template name="add-child-document-usability-links">
+ <xsl:element name="center">
+ <xsl:element name="small">
+ <xsl:text>[ </xsl:text>
+
+
+ <xsl:variable name="globalDocumentDir" select="sxghelper:get-global-document-dir()"/>
+ <xsl:variable name="currentChildNo" select="number($contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url]/@child-document-no)"/>
+ <xsl:variable name="earlierDocURL" select="$contentTableHeadings/heading[($currentChildNo - 1) = @child-document-no]/@out-file-url"/>
+<!--
+<xsl:message>from: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
+<xsl:message>to: <xsl:value-of select="$earlierDocURL"/></xsl:message>
+<xsl:message>Is: <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
+ </xsl:call-template>
+</xsl:message>-->
+
+
+ <xsl:if test="$earlierDocURL">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <!-- when the links starts with a '#' it's a link to the Content Table-->
+ <xsl:choose>
+ <xsl:when test="starts-with($earlierDocURL, '#')">
+
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="."/>
+ </xsl:call-template>
+<!-- <xsl:value-of select="concat($contentTableURL, $earlierDocURL)"/>-->
+ </xsl:when>
+ <xsl:otherwise>
+
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
+ </xsl:call-template>
+<!--
+
+ <xsl:value-of select="concat($globalDocumentDir, $earlierDocURL)"/>-->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:text>Previous document</xsl:text>
+ </xsl:element>
+
+ <xsl:text> | </xsl:text>
+ </xsl:if>
+
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <!-- when globalDocumentRefToCurrentFile is unset the current file is the Content Table-->
+ <xsl:choose>
+ <xsl:when test="$globalDocumentRefToCurrentFile">
+ <xsl:variable name="contentTableDir">
+ <xsl:call-template name="get-name-of-table-of-content-document"/>
+ </xsl:variable>
+
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="$contentTableDir"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>#</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+<!-- <xsl:value-of select="$contentTableURL"/>-->
+ </xsl:attribute>
+ <xsl:text>Content Table</xsl:text>
+ </xsl:element>
+
+
+ <xsl:variable name="nextDocURL" select="$contentTableHeadings/heading[($currentChildNo + 1) = @child-document-no]/@out-file-url"/>
+ <xsl:if test="$nextDocURL">
+ <xsl:text> | </xsl:text>
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <!-- when the links starts with a '#' it's a link to the Content Table-->
+ <xsl:choose>
+ <xsl:when test="starts-with($nextDocURL, '#')">
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="."/>
+ </xsl:call-template>
+<!-- <xsl:value-of select="concat($contentTableURL, $nextDocURL)"/>-->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="$nextDocURL"/>
+ </xsl:call-template>
+<!-- <xsl:value-of select="concat($globalDocumentDir, $nextDocURL)"/>-->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:text>Next document</xsl:text>
+ </xsl:element>
+ </xsl:if>
+ <xsl:text> ]</xsl:text>
+ </xsl:element>
+ </xsl:element>
+ </xsl:template>
+
+
+ <xsl:template name="get-relative-file-ref">
+ <xsl:param name="sourceFileRef"/>
+ <xsl:param name="targetFileRef"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-relative-file-ref')">
+ <xsl:value-of select="sxghelper:get-relative-file-ref(string($sourceFileRef), string($targetFileRef))"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef(string($sourceFileRef), string($targetFileRef))"/>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+ <xsl:template name="get-name-of-table-of-content-document">
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-name-of-table-of-content-document')">
+ <xsl:value-of select="sxghelper:get-name-of-table-of-content-document()"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument()"/>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+ <xsl:template name="debug-content-table-headings-variable">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:message><xsl:text>**** THE HEADING VARIABLE **** </xsl:text></xsl:message>
+ <xsl:message>content-table-url: <xsl:value-of select="collectedGlobalData/content-table-headings/content-table-url"/></xsl:message>
+
+ <xsl:for-each select="$collectedGlobalData/content-table-headings/heading">
+ <xsl:message><xsl:text>**** new heading: </xsl:text></xsl:message>
+ <xsl:message>content-table-id: <xsl:value-of select="@content-table-id"/></xsl:message>
+ <xsl:message>child-document-no: <xsl:value-of select="@child-document-no"/></xsl:message>
+ <xsl:message>file-url: <xsl:value-of select="@file-url"/></xsl:message>
+ <xsl:message>out-file-url: <xsl:value-of select="@out-file-url"/></xsl:message>
+ <xsl:message>level: <xsl:value-of select="@level"/></xsl:message>
+ <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
+ <xsl:message>encoded-title: <xsl:value-of select="@encoded-title"/></xsl:message>
+ <xsl:message>absolute-chapter-level:<xsl:value-of select="@absolute-chapter-level"/></xsl:message>
+ </xsl:for-each>
+
+ </xsl:template>
+
+
+ <!-- To make the headings unique, the absolute heading is added to them
+ E.g. The level 1.2.3.4. would result into a 1+2+3+4 string -->
+ <xsl:template name="calc-chapter-numbers">
+ <xsl:param name="level"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:calc-chapter-numbers')">
+ <xsl:value-of select="sxghelper:calc-chapter-numbers($level)"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers($level)"/>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+
+
+ <xsl:template match="text:p" mode="content-table">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:variable name="allTabStopStyles" select="$office:automatic-styles/style:style[@style:name = current()/@text:style-name]/style:properties/style:tab-stops"/>
+
+ <xsl:element name="table">
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="class"><xsl:value-of select="@text:style-name"/></xsl:attribute>
+<!--
+<xsl:message>*********</xsl:message>
+<xsl:message>Stylename:<xsl:value-of select="@text:style-name"/></xsl:message>
+<xsl:message>position: <xsl:value-of select="count($allTabStopStyles/style:tab-stop)"/></xsl:message>
+-->
+
+ <xsl:element name="colgroup">
+ <xsl:call-template name="create-col-element">
+ <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:element>
+
+
+ <!-- all elements before the first tabStop -->
+ <xsl:variable name="testNo-RTF">
+ <xsl:apply-templates select="node()" mode="cell-content"/>
+ </xsl:variable>
+
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
+ <xsl:element name="tr">
+ <xsl:call-template name="create-td-elements">
+ <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+ <xsl:with-param name="position" select="1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:variable name="tabNodePositions" select="xalan:nodeset($testNo-RTF)"/>
+ <xsl:element name="tr">
+ <xsl:call-template name="create-td-elements">
+ <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+ <xsl:with-param name="position" select="1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
+
+ <xsl:element name="tr">
+ <xsl:call-template name="create-td-elements">
+ <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+ <xsl:with-param name="position" select="1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>-->
+
+
+ </xsl:element>
+ </xsl:template>
+
+
+ <xsl:template name="create-col-element">
+ <xsl:param name="lastNodePosition"/>
+ <xsl:param name="allTabStopStyles"/>
+
+ <xsl:for-each select="$allTabStopStyles/style:tab-stop">
+ <xsl:element name="col">
+ <xsl:attribute name="style">
+ <xsl:text>width: </xsl:text>
+ <xsl:call-template name="grap-cell-width">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:for-each>
+
+ </xsl:template>
+<!--
+Scenarios tabstops
+
+1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
+ -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.
+
+2) style:type is 'right' and earlier tabStop is right
+ -> following text-nodes, will be put into a right aligned TD
+
+3) style:type is 'non-right' and earlier tabStop 'non-right' as well
+ -> put the preceding tab stops into a TD (left aligned is default)
+
+4) first style:type would have no right precedign tabStop
+ -> works well with first sceanrios 1 and 3
+
+5) last style:type would be a special case, if it would be left aligned, but this won't happen in our case.. :D
+
+Scenarios unmatched:
+- text:styleposition 'center' will not be matched in our case (effort for nothing), there will be only 'right' and not 'right'
+- If the last tabStop is not from text:stylepostion 'right', the length of the last cell is undefined and a document length must be found.
+ Not happens in our global document case. Also the algorithm below would have to be expanded (cp. scenario 5).
+
+-->
+ <xsl:template name="create-td-elements">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="lastNodePosition"/>
+ <xsl:param name="position"/>
+ <xsl:param name="allTabStopStyles"/>
+ <xsl:param name="tabNodePositions"/>
+<!--
+<xsl:message>++++++++</xsl:message>
+<xsl:message>Position: <xsl:value-of select="$position"/></xsl:message>
+<xsl:message>lastNodePosition: <xsl:value-of select="$lastNodePosition"/></xsl:message>
+-->
+
+ <xsl:variable name="currentStyleType" select="$allTabStopStyles/style:tab-stop[$position]/@style:type"/>
+ <xsl:variable name="earlierStyleType" select="$allTabStopStyles/style:tab-stop[$position - 1]/@style:type"/>
+ <xsl:choose>
+ <xsl:when test="$currentStyleType = 'right'">
+ <xsl:choose>
+ <xsl:when test="$earlierStyleType = 'right'">
+ <!--
+ 2) style:type is 'right' and earlier tabStop is right
+ -> following text-nodes, will be put into a right aligned TD -->
+ <xsl:element name="td">
+ <xsl:attribute name="style">
+ <xsl:text>align: right</xsl:text>
+ </xsl:attribute>
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--
+ 1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
+ -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.-->
+<!-- valid HTML but browsers make a line break (border=0 and paragraphstyle also missing):
+ <xsl:element name="table">
+ <xsl:element name="td">
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:attribute name="style">
+ <xsl:text>align: right</xsl:text>
+ </xsl:attribute>
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:element>
+-->
+ <xsl:element name="td">
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+<!-- ODK FEATURE NO PAGES
+ <xsl:element name="td">
+ <xsl:attribute name="style">
+ <xsl:text>align: right</xsl:text>
+ </xsl:attribute>
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element> -->
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$earlierStyleType = 'right'">
+ </xsl:when>
+ <xsl:otherwise>
+ <!--
+ 3) style:type is 'non-right' and earlier tabStop 'non-right' as well
+ -> put the preceding tab stops into a TD (left aligned is default) -->
+ <xsl:element name="td">
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$position != $lastNodePosition">
+ <xsl:call-template name="create-td-elements">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="position" select="$position + 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+
+ <xsl:template name="grap-cell-content-before-tab-stop">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="endingTabStopPosition"/>
+ <xsl:param name="tabNodePositions"/>
+ <xsl:param name="lastNodePosition"/>
+
+ <xsl:choose>
+ <xsl:when test="$endingTabStopPosition = 1">
+ <xsl:apply-templates mode="content-table" select="node()[position() < $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]]">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$endingTabStopPosition > $lastNodePosition">
+ <xsl:apply-templates mode="content-table" select="node()[position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="content-table" select="node()[position() < $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]][position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template mode="content-table" match="text:s">
+ <xsl:call-template name="write-breakable-whitespace">
+ <xsl:with-param name="whitespaces" select="@text:c"/>
+ </xsl:call-template>
+ </xsl:template>
+
+
+ <xsl:template match="*" mode="cell-content">
+
+ <xsl:if test="name() = 'text:tab-stop' or *[name() = 'text:tab-stop']">
+ <xsl:element name="tab-stop-node-position">
+ <xsl:value-of select="position()"/>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+
+ <xsl:template name="grap-cell-width">
+ <xsl:param name="position"/>
+ <xsl:param name="allTabStopStyles"/>
+
+ <xsl:variable name="tabStopPosition" select="$allTabStopStyles/style:tab-stop[$position]/@style:position"/>
+ <xsl:choose>
+ <xsl:when test="contains($tabStopPosition, 'cm')">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'cm'))"/>
+ <xsl:with-param name="unit" select="'cm'"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($tabStopPosition, 'in')">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'in'))"/>
+ <xsl:with-param name="unit" select="'in'"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($tabStopPosition, 'ch')">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'ch'))"/>
+ <xsl:with-param name="unit" select="'ch'"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($tabStopPosition, 'pt')">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'pt'))"/>
+ <xsl:with-param name="unit" select="'pt'"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="create-cell-width">
+ <xsl:param name="width"/>
+ <xsl:param name="unit"/>
+ <xsl:param name="position"/>
+ <xsl:param name="allTabStopStyles"/>
+
+ <xsl:choose>
+ <xsl:when test="$position > 1">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="$width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit))"/>
+ <xsl:with-param name="unit" select="$unit"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$position = 1">
+ <xsl:value-of select="concat($width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit)), $unit)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat($width, $unit)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@lenya.apache.org
For additional commands, e-mail: commits-help@lenya.apache.org