metanorma/metanorma-gb

View on GitHub
lib/isodoc/gb/gb.recommendation.xsl

Summary

Maintainability
Test Coverage
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:gb="https://www.metanorma.org/ns/gb" xmlns:mathml="http://www.w3.org/1998/Math/MathML" xmlns:xalan="http://xml.apache.org/xalan" xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" xmlns:java="http://xml.apache.org/xalan/java" exclude-result-prefixes="java" version="1.0">

    <xsl:output method="xml" encoding="UTF-8" indent="no"/>

    <xsl:key name="kfn" match="*[local-name() = 'fn'][not(ancestor::*[(local-name() = 'table' or local-name() = 'figure') and not(ancestor::*[local-name() = 'name'])])]" use="@reference"/>

    <xsl:variable name="debug">false</xsl:variable>

    <xsl:variable name="part" select="normalize-space(/gb:gb-standard/gb:bibdata/gb:ext/gb:structuredidentifier/gb:project-number/@part)"/>

    <xsl:variable name="standard-name">
        <xsl:call-template name="capitalize">
            <xsl:with-param name="str" select="/gb:gb-standard/gb:bibdata/gb:ext/gb:gbtype/gb:gbscope"/>
        </xsl:call-template>
        <xsl:text> standard (</xsl:text>
        <xsl:call-template name="capitalize">
            <xsl:with-param name="str" select="/gb:gb-standard/gb:bibdata/gb:ext/gb:gbtype/gb:gbmandate"/>
        </xsl:call-template>
        <xsl:text>)</xsl:text>
    </xsl:variable>

    <xsl:variable name="language" select="/gb:gb-standard/gb:bibdata/gb:language"/>

    <!-- Example:
        <item level="1" id="Foreword" display="true">Foreword</item>
        <item id="term-script" display="false">3.2</item>
    -->
    <xsl:variable name="contents_">
        <contents>
            <xsl:call-template name="processPrefaceSectionsDefault_Contents"/>
            <xsl:call-template name="processMainSectionsDefault_Contents"/>

            <xsl:call-template name="processTablesFigures_Contents"/>
        </contents>
    </xsl:variable>
    <xsl:variable name="contents" select="xalan:nodeset($contents_)"/>

    <xsl:template match="/">
        <xsl:call-template name="namespaceCheck"/>
        <fo:root xml:lang="{$lang}">
            <xsl:variable name="root-style">
                <root-style xsl:use-attribute-sets="root-style"/>
            </xsl:variable>
            <xsl:call-template name="insertRootStyle">
                <xsl:with-param name="root-style" select="$root-style"/>
            </xsl:call-template>
            <fo:layout-master-set>

                <!-- cover page -->
                <fo:simple-page-master master-name="cover" page-width="{$pageWidth}mm" page-height="{$pageHeight}mm">
                    <fo:region-body margin-top="10mm" margin-bottom="24mm" margin-left="25mm" margin-right="23mm"/>
                    <fo:region-before region-name="cover-header" extent="10mm"/>
                    <fo:region-after region-name="cover-footer" extent="24mm"/>
                    <fo:region-start region-name="cover-left-region" extent="25mm"/>
                    <fo:region-end region-name="cover-right-region" extent="23mm"/>
                </fo:simple-page-master>

                <!-- contents pages -->
                <!-- odd pages -->
                <fo:simple-page-master master-name="odd" page-width="{$pageWidth}mm" page-height="{$pageHeight}mm">
                    <fo:region-body margin-top="{$marginTop}mm" margin-bottom="{$marginBottom}mm" margin-left="{$marginLeftRight1}mm" margin-right="{$marginLeftRight2}mm"/>
                    <fo:region-before region-name="header" extent="{$marginTop}mm"/>
                    <fo:region-after region-name="footer-odd" extent="{$marginBottom}mm"/>
                    <fo:region-start region-name="left-region" extent="{$marginLeftRight1}mm"/>
                    <fo:region-end region-name="right-region" extent="{$marginLeftRight2}mm"/>
                </fo:simple-page-master>
                <!-- even pages -->
                <fo:simple-page-master master-name="even" page-width="{$pageWidth}mm" page-height="{$pageHeight}mm">
                    <fo:region-body margin-top="{$marginTop}mm" margin-bottom="{$marginBottom}mm" margin-left="{$marginLeftRight2}mm" margin-right="{$marginLeftRight1}mm"/>
                    <fo:region-before region-name="header" extent="{$marginTop}mm"/>
                    <fo:region-after region-name="footer-even" extent="{$marginBottom}mm"/>
                    <fo:region-start region-name="left-region" extent="{$marginLeftRight2}mm"/>
                    <fo:region-end region-name="right-region" extent="{$marginLeftRight1}mm"/>
                </fo:simple-page-master>
                <fo:page-sequence-master master-name="preface">
                    <fo:repeatable-page-master-alternatives>
                        <fo:conditional-page-master-reference odd-or-even="even" master-reference="even"/>
                        <fo:conditional-page-master-reference odd-or-even="odd" master-reference="odd"/>
                    </fo:repeatable-page-master-alternatives>
                </fo:page-sequence-master>
                <fo:page-sequence-master master-name="document">
                    <fo:repeatable-page-master-alternatives>
                        <fo:conditional-page-master-reference odd-or-even="even" master-reference="even"/>
                        <fo:conditional-page-master-reference odd-or-even="odd" master-reference="odd"/>
                    </fo:repeatable-page-master-alternatives>
                </fo:page-sequence-master>

                <fo:simple-page-master master-name="last-odd" page-width="215.9mm" page-height="279.4mm">
                    <fo:region-body margin-top="20mm" margin-bottom="20mm" margin-left="30mm" margin-right="15mm"/>
                    <fo:region-before region-name="header" extent="20mm"/>
                    <fo:region-after region-name="footer-odd" extent="20mm"/>
                    <fo:region-start region-name="left-region" extent="30mm"/>
                    <fo:region-end region-name="right-region" extent="15mm"/>
                </fo:simple-page-master>
                <fo:simple-page-master master-name="last-even" page-width="215.9mm" page-height="279.4mm">
                    <fo:region-body margin-top="20mm" margin-bottom="20mm" margin-left="15mm" margin-right="30mm"/>
                    <fo:region-before region-name="header" extent="20mm"/>
                    <fo:region-after region-name="footer-odd" extent="20mm"/>
                    <fo:region-start region-name="left-region" extent="15mm"/>
                    <fo:region-end region-name="right-region" extent="30mm"/>
                </fo:simple-page-master>
                <fo:page-sequence-master master-name="last">
                    <fo:repeatable-page-master-alternatives>
                        <fo:conditional-page-master-reference odd-or-even="even" master-reference="last-even"/>
                        <fo:conditional-page-master-reference odd-or-even="odd" master-reference="last-odd"/>
                    </fo:repeatable-page-master-alternatives>
                </fo:page-sequence-master>
            </fo:layout-master-set>

            <fo:declarations>
                <xsl:call-template name="addPDFUAmeta"/>
            </fo:declarations>

            <xsl:call-template name="addBookmarks">
                <xsl:with-param name="contents" select="$contents"/>
            </xsl:call-template>

            <fo:page-sequence master-reference="cover" force-page-count="no-force">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block-container>
                        <xsl:variable name="ccs" select="normalize-space(/gb:gb-standard/gb:bibdata/gb:ext/gb:ccs)"/>
                        <fo:block font-weight="bold" line-height="130%">
                            <xsl:if test="$ccs != ''">
                                <xsl:text>ICS</xsl:text>
                            </xsl:if>
                            <xsl:text> </xsl:text>
                            <xsl:value-of select="$linebreak"/>
                            <xsl:value-of select="substring($ccs, 1, 1)"/>
                            <xsl:text> </xsl:text>
                            <fo:inline font-family="SimHei" font-weight="normal"><xsl:value-of select="substring($ccs, 2)"/></fo:inline>
                            <xsl:text> </xsl:text>
                        </fo:block>
                    </fo:block-container>
                    <!-- GB Logo -->
                    <fo:block-container position="absolute" top="3mm" left="119mm"> <!-- top="8mm"  -->
                        <fo:block>
                            <xsl:variable name="gbprefix" select="normalize-space(java:toLowerCase(java:java.lang.String.new(/gb:gb-standard/gb:bibdata/gb:ext/gb:gbtype/gb:gbprefix)))"/>
                            <xsl:choose>
                                <xsl:when test="$gbprefix = 'db' or $gbprefix = '81'">
                                    <fo:instream-foreign-object fox:alt-text="Logo">
                                        <svg xmlns="http://www.w3.org/2000/svg" id="图层_1" data-name="图层 1" viewBox="0 0 133.2 66.6"><title>gb-standard-db</title><path d="M56.5,0H0V66.6H56.5A8.5,8.5,0,0,0,65,58.1V8.5A8.5,8.5,0,0,0,56.5,0ZM42.4,56.3a2.9,2.9,0,0,1-2.9,2.9H22.8V7.5H39.5a2.8,2.8,0,0,1,2.9,2.8Z"/><path d="M133.2,24.7V8.5A8.5,8.5,0,0,0,124.7,0H68.2V66.6h56.5a8.5,8.5,0,0,0,8.5-8.5V41.3a8.6,8.6,0,0,0-6.9-8.3A8.6,8.6,0,0,0,133.2,24.7ZM110.6,56.3a2.9,2.9,0,0,1-2.9,2.9H91.1v-22h16.6a2.9,2.9,0,0,1,2.9,2.8Zm0-29.6a2.9,2.9,0,0,1-2.9,2.9H91.1V7.5h16.6a2.8,2.8,0,0,1,2.9,2.8Z"/></svg>
                                    </fo:instream-foreign-object>
                                </xsl:when>
                                <xsl:when test="$gbprefix = 'gb'">
                                    <fo:instream-foreign-object fox:alt-text="Logo">
                                        <svg xmlns="http://www.w3.org/2000/svg" width="29.9mm" id="图层_1" data-name="图层 1" viewBox="0 0 232.1 117"><defs><style>.cls-1{fill:#fff;}.cls-1,.cls-2,.cls-3{stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.32px;}.cls-3{fill:none;}</style></defs><title>gb-standard-gb</title><path class="cls-1" d="M201.6,36.5c0,5.6-4.3,8.4-8.8,8.4H147.9L136,58.5h55.2c14,0,22.7-9.1,23.7-19.8.7-6.5-.9-14.1-6-19l-9.6,11A7.6,7.6,0,0,1,201.6,36.5Z"/><path class="cls-1" d="M133.6,102.7V14.6h61c6.4,0,11,2,14.3,5.1L218.1,9C212.5,4.1,204.4.7,192.8.7H120.1V116.3l13.6-13.6Z"/><path class="cls-1" d="M216.6,81.1c0-11.9-7.1-16-7.1-16a82,82,0,0,1-9.5,9.5,6.1,6.1,0,0,1,2.3,5c0,3.3-.7,8.9-12.3,8.9H147.9l-14.2,14.2h50.8C203.9,102.7,216.6,95.7,216.6,81.1Z"/><path class="cls-2" d="M223.1,56.7s8.3-11.6,7-23.5c-.8-7.1-3.8-17.2-12-24.2l-9.2,10.7c5.1,4.9,6.7,12.5,6,19-1,10.7-9.7,19.8-23.7,19.8H136l11.9-13.6V28.6h44.9a9.4,9.4,0,0,1,6.5,2.1l9.6-11c-3.3-3.1-7.9-5.1-14.3-5.1h-61v88.1h.1l14.2-14.2V72.8h44.9c3.5,0,5.8.7,7.2,1.8a82,82,0,0,0,9.5-9.5s7.1,4.1,7.1,16c0,14.6-12.7,21.6-32.1,21.6H133.7l-13.6,13.6h72.7c20.6,0,35-13.6,37.4-25.5S232.1,67,223.1,56.7Z"/><line class="cls-3" x1="133.6" y1="14.6" x2="120.1" y2="0.7"/><polygon class="cls-2" points="70.9 59.6 57.8 74.7 85.1 74.7 98.8 59.6 70.9 59.6"/><path class="cls-2" d="M52,15.9c-8.8,0-35,9.3-36,38-.6,16,4.3,28.2,11.3,36.3l10.8-9.8c-5.2-4.8-9.2-12.2-9.2-23.1,0-21.4,21-27.3,28.9-27.3H113L98.8,15.9Z"/><path class="cls-1" d="M49.8,101.6h49v-42L85.1,74.7V88.5H57.8a31,31,0,0,1-19.7-8.1L27.3,90.2C33.8,97.6,42.2,101.6,49.8,101.6Z"/><polygon class="cls-1" points="57.8 45.4 57.8 74.7 70.9 59.6 98.8 59.6 113 45.4 85.1 45.4 57.8 45.4"/><path class="cls-2" d="M98.8,101.6h-49c-7.6,0-16-4-22.5-11.4L17,99.5c9.3,10.1,22.7,16.8,40.8,16.8H113V45.4L98.8,59.6Z"/><path class="cls-1" d="M16,53.9c1-28.7,27.2-38,36-38H98.8L113,30V.7H57.8C34.2.7.7,22,.7,52.9.7,69.8,5.8,87.2,17,99.5l10.3-9.3C20.3,82.1,15.4,69.9,16,53.9Z"/><line class="cls-3" x1="57.8" y1="45.4" x2="70.9" y2="59.6"/><line class="cls-3" x1="85.1" y1="88.5" x2="98.8" y2="101.6"/><line class="cls-3" x1="98.8" y1="15.9" x2="113" y2="0.7"/></svg>
                                    </fo:instream-foreign-object>
                                </xsl:when>
                                <xsl:when test="$gbprefix = 'gjb'">
                                    <fo:instream-foreign-object fox:alt-text="Logo">
                                        <svg xmlns="http://www.w3.org/2000/svg" id="图层_1" data-name="图层 1" viewBox="0 0 232.2 88.4"><defs><style>.cls-1{fill:#fff;}.cls-1,.cls-2,.cls-3{stroke:#000;stroke-linecap:round;stroke-linejoin:round;}.cls-3{fill:none;}</style></defs><title>gb-standard-gjb</title><path class="cls-1" d="M209.1,27.6c0,4.2-3.3,6.4-6.7,6.4H168.5l-9,10.2h41.7c10.6,0,17.2-6.9,18-14.9.5-4.9-.7-10.7-4.6-14.4l-7.2,8.3A5.9,5.9,0,0,1,209.1,27.6Z"/><path class="cls-1" d="M157.7,77.6V11h46.1a15.4,15.4,0,0,1,10.8,3.9l7-8.1C217.3,3.1,211.2.5,202.4.5H147.5V87.9l10.3-10.3Z"/><path class="cls-1" d="M220.4,61.3c0-9-5.3-12.1-5.3-12.1a70.7,70.7,0,0,1-7.2,7.2,4.5,4.5,0,0,1,1.7,3.7c0,2.5-.5,6.8-9.3,6.8H168.5L157.8,77.6h38.4C210.9,77.6,220.4,72.3,220.4,61.3Z"/><path class="cls-2" d="M225.4,42.9s6.2-8.8,5.2-17.8c-.6-5.4-2.8-13-9-18.3l-7,8.1c3.9,3.7,5.1,9.5,4.6,14.4-.8,8-7.4,14.9-18,14.9H159.5l9-10.2V21.6h33.9a7.5,7.5,0,0,1,5,1.6l7.2-8.3A15.4,15.4,0,0,0,203.8,11H157.7V77.6h.1l10.7-10.7V55h33.9a9.1,9.1,0,0,1,5.5,1.4,70.7,70.7,0,0,0,7.2-7.2s5.3,3.1,5.3,12.1c0,11-9.5,16.3-24.2,16.3H157.8L147.5,87.9h54.9c15.6,0,26.5-10.3,28.3-19.3S232.1,50.6,225.4,42.9Z"/><line class="cls-3" x1="157.7" y1="11" x2="147.5" y2="0.5"/><path class="cls-2" d="M121.4,87.9c10.3,0,20.3-12.1,20.3-24.5V.5h-21V57.6c0,3.9,0,9.3-7.3,9.3H87.7v21h33.7Z"/><path class="cls-1" d="M120.7,57.6c0,3.9,0,9.3-7.3,9.3H87.7v21L98.8,77.4h19.3c8.3,0,13.3-6,13.3-19V11L141.7.5h-21Z"/><line class="cls-3" x1="131.4" y1="11" x2="120.7" y2="0.5"/><line class="cls-3" x1="98.8" y1="77.4" x2="87.7" y2="66.9"/><polygon class="cls-2" points="51.4 45.1 41.5 56.5 62.2 56.5 72.5 45.1 51.4 45.1"/><path class="cls-2" d="M39.3,12c-6.6,0-26.5,7-27.2,28.7-.4,12.1,3.2,21.4,8.5,27.4l8.2-7.3c-3.9-3.7-7-9.3-7-17.5,0-16.2,15.9-20.6,21.9-20.6H83.3L72.6,12Z"/><path class="cls-1" d="M37.6,76.7h35V45.1L62.2,56.5V66.9H43.7a23.8,23.8,0,0,1-14.9-6.1l-8.2,7.3C25.6,73.8,31.9,76.7,37.6,76.7Z"/><polygon class="cls-1" points="41.5 34.3 41.5 56.5 51.4 45.1 72.5 45.1 83.3 34.3 62.2 34.3 41.5 34.3"/><path class="cls-2" d="M72.6,76.7h-35c-5.7,0-12-2.9-17-8.6l-7.7,7.1c7,7.7,17.1,12.7,30.8,12.7H83.3V34.3L72.6,45.1Z"/><path class="cls-1" d="M12.1,40.7C12.8,19,32.7,12,39.3,12H72.6L83.3,22.7V.5H43.7C25.9.5.5,16.6.5,40c0,12.8,3.9,25.9,12.4,35.2l7.7-7.1C15.3,62.1,11.7,52.8,12.1,40.7Z"/><line class="cls-3" x1="41.5" y1="34.3" x2="51.4" y2="45.1"/><line class="cls-3" x1="62.2" y1="66.9" x2="72.6" y2="76.7"/><line class="cls-3" x1="72.6" y1="12" x2="83.3" y2="0.5"/></svg>
                                    </fo:instream-foreign-object>
                                </xsl:when>
                                <xsl:when test="$gbprefix = 'gm'">
                                    <fo:instream-foreign-object fox:alt-text="Logo">
                                        <svg xmlns="http://www.w3.org/2000/svg" id="图层_1" data-name="图层 1" viewBox="0 0 187.2 95.1"><title>gb-standard-gm</title><polygon points="160 0 141.8 32.9 123.6 0 96.3 0 96.3 11.3 96.3 95.1 123.6 95.1 123.6 60.7 125 63.3 141.8 93.6 158.5 63.3 160 60.7 160 95.1 187.2 95.1 187.2 11.3 187.2 0 160 0"/><path d="M81.3,0H9.9A10,10,0,0,0,0,9.9V85.2a9.9,9.9,0,0,0,9.9,9.9h43a9.9,9.9,0,0,0,6.8-2.7v2.7H91.2V43.2H48.8v9.5H59.7V78.9A5.7,5.7,0,0,1,54,84.5H37.2a5.7,5.7,0,0,1-5.7-5.6V16.3a5.8,5.8,0,0,1,5.7-5.7H54a5.8,5.8,0,0,1,5.7,5.7V31.2H91.2V9.9A10,10,0,0,0,81.3,0Z"/></svg>
                                    </fo:instream-foreign-object>
                                </xsl:when>
                                <xsl:when test="$gbprefix = 'jjf'">
                                    <fo:instream-foreign-object fox:alt-text="Logo">
                                        <svg xmlns="http://www.w3.org/2000/svg" id="图层_1" data-name="图层 1" viewBox="0 0 226.8 89.6"><defs><style>.cls-1,.cls-2,.cls-3{stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.2px;}.cls-2{fill:#fff;}.cls-3{fill:none;}</style></defs><title>gb-standard-jjf</title><polygon class="cls-1" points="84.3 12.3 75.1 23.9 144.4 23.9 144.4 0.6 133.7 12.3 84.3 12.3"/><polygon class="cls-2" points="75.1 23.9 84.3 12.3 133.7 12.3 144.4 0.6 75.1 0.6 75.1 23.9"/><path class="cls-2" d="M92,73.6c2.6,2.2,6.2,3.4,11.3,3.4,13.4,0,19.1-7.3,19.1-22.2V13.5L110.7,23.7V62s-1,4.6-5.5,4.6a7.5,7.5,0,0,1-3.9-1h0Z" transform="translate(0)"/><path class="cls-1" d="M86.8,57c0,7.1,1.2,13,5.2,16.6l9.3-8h0c-1.9-1.1-2.8-3.3-2.8-6.2V44L86.8,51.7Z" transform="translate(0)"/><path class="cls-1" d="M110.7,12.3V23.7l11.7-10.2V54.8c0,14.9-5.7,22.2-19.1,22.2-5.1,0-8.7-1.2-11.3-3.4l-7.9,6.8c5,4.5,12,7.4,20.8,7.4,19,0,29.1-14.2,29.1-25.8V12.3Z" transform="translate(0)"/><path class="cls-2" d="M86.8,57V51.7L98.5,44H75.1V59.4a28.7,28.7,0,0,0,9,21L92,73.6C88,70,86.8,64.1,86.8,57Z" transform="translate(0)"/><polyline class="cls-3" points="88.4 53.6 86.8 51.7 75.1 44"/><line class="cls-3" x1="84.3" y1="12.3" x2="75.1" y2="0.6"/><polygon class="cls-1" points="9.8 12.3 0.6 23.9 69.9 23.9 69.9 0.6 59.1 12.3 9.8 12.3"/><polygon class="cls-2" points="0.6 23.9 9.8 12.3 59.1 12.3 69.9 0.6 0.6 0.6 0.6 23.9"/><path class="cls-2" d="M17.5,73.6C20,75.8,23.7,77,28.8,77c13.4,0,19-7.3,19-22.2V13.5L36.2,23.7V62s-1.1,4.6-5.5,4.6a8.2,8.2,0,0,1-4-1h0Z" transform="translate(0)"/><path class="cls-1" d="M12.3,57c0,7.1,1.2,13,5.2,16.6l9.2-8h0c-1.8-1.1-2.8-3.3-2.8-6.2V44L12.3,51.7Z" transform="translate(0)"/><path class="cls-1" d="M36.2,12.3V23.7L47.8,13.5V54.8c0,14.9-5.6,22.2-19,22.2-5.1,0-8.8-1.2-11.3-3.4L9.6,80.4c5,4.5,12,7.4,20.7,7.4,19,0,29.2-14.2,29.2-25.8V12.3Z" transform="translate(0)"/><path class="cls-2" d="M12.3,57V51.7L23.9,44H.6V59.4a28.4,28.4,0,0,0,9,21l7.9-6.8C13.5,70,12.3,64.1,12.3,57Z" transform="translate(0)"/><polyline class="cls-3" points="13.9 53.6 12.3 51.7 0.6 44"/><line class="cls-3" x1="9.8" y1="12.3" x2="0.6" y2="0.6"/><polygon class="cls-1" points="226.2 0.6 173.4 0.6 152.4 0.6 149.1 0.6 149.1 89 173.4 89 173.4 24.9 226.2 24.9 226.2 0.6"/><rect class="cls-1" x="161.3" y="36.6" width="64.9" height="24.33"/><polygon class="cls-2" points="162.1 48.8 216.1 48.8 226.2 36.6 173.4 36.6 162.1 48.8"/><polygon class="cls-2" points="152.4 0.6 149.1 0.6 149.1 89 161.3 79.1 161.3 12.3 216.8 12.3 226.2 0.6 173.4 0.6 152.4 0.6"/><line class="cls-3" x1="161.3" y1="12.3" x2="149.1" y2="0.6"/></svg>
                                    </fo:instream-foreign-object>
                                </xsl:when>
                                <xsl:when test="$gbprefix = 'zb'">
                                    <fo:instream-foreign-object fox:alt-text="Logo">
                                        <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="图层_1" x="0px" y="0px" viewBox="0 0 157.1 81.9" style="enable-background:new 0 0 157.1 81.9;" xml:space="preserve">
                                        <g>
                                            <rect x="80.8" width="32.2" height="81.9"/>
                                            <polygon points="74.9,46.2 42.7,81.9 74.9,81.9  "/>
                                            <polygon points="33.6,0 0,0 0,37.8  "/>
                                            <path d="M157.1,61.1c0-8.6-6-17.5-15.4-21c7.7-1.1,14.6-10.4,14.6-21.2c0-10.8-9.5-19-27.7-19h-11.7v81.1             c5.3,0.4,11.4,0.8,17.7,0.8C153,81.9,157.1,69.8,157.1,61.1z"/>
                                            <polygon points="75.6,0 40.6,0 0,81.9 35,81.9  "/>
                                        </g>
                                        </svg>
                                    </fo:instream-foreign-object>
                                </xsl:when>
                                <xsl:when test="$gbprefix = 'ls' or $gbprefix = 'abc'">
                                    <xsl:attribute name="text-align">right</xsl:attribute>
                                    <xsl:attribute name="font-weight">bold</xsl:attribute>
                                    <fo:inline font-size="36pt"><xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:ext/gb:gbtype/gb:gbprefix"/></fo:inline>
                                </xsl:when>
                                <!-- <xsl:when test="$gbprefix = 'gb'">
                                    <fo:external-graphic src="{concat('data:image/gif;base64,', normalize-space($Image-GB-Logo))}" width="29.9mm" content-height="14.8mm" content-width="scale-to-fit" scaling="uniform" fox:alt-text="Image GB Logo"/>
                                </xsl:when> -->
                                <xsl:otherwise> </xsl:otherwise>
                            </xsl:choose>
                        </fo:block>
                    </fo:block-container>
                    <!-- National standard (Recommended) -->
                    <fo:block-container position="absolute" left="0mm" top="28mm" width="170mm" text-align="center">
                        <fo:block font-weight="bold" font-size="12pt"> <!-- font-stretch="wider" not supported by FOP-->
                            <xsl:call-template name="addLetterSpacing">
                                <xsl:with-param name="text" select="$standard-name"/>
                                <xsl:with-param name="letter-spacing" select="0.7"/>
                            </xsl:call-template>
                        </fo:block>
                    </fo:block-container>
                    <fo:block-container position="absolute" left="0mm" top="43mm" height="46.4mm" width="165mm" text-align="right">
                        <fo:block>
                            <!-- GB/T/303 80021.1 -->
                            <fo:block font-family="SimHei" font-size="14pt">
                                <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:docidentifier[@type = 'gb']"/>
                            </fo:block>
                            <!-- Partly Supercedes GB/T 88021-2016 -->
                            <fo:block margin-top="2.85pt">
                                <xsl:variable name="title-partly-supercedes">
                                    <xsl:choose>
                                        <xsl:when test="$lang = 'zh'">部分代替 </xsl:when>
                                        <xsl:otherwise>Partly Supercedes </xsl:otherwise>
                                    </xsl:choose>
                                </xsl:variable>
                                <xsl:value-of select="$title-partly-supercedes"/>
                                <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:relation[@type='obsoletes']/gb:bibitem/gb:docidentifier"/>
                            </fo:block>
                        </fo:block>
                    </fo:block-container>
                    <fo:block-container position="absolute" left="0mm" top="66mm" height="2mm" width="170mm" border-top="1pt solid black">
                        <fo:block> </fo:block>
                    </fo:block-container>
                    <fo:block-container position="absolute" left="-2.5mm" top="106mm" height="124mm" width="165mm" text-align="center">
                        <!-- Cereals and pulses—Specifications and test methods—Part 1: Rice -->
                        <fo:block font-size="26pt" line-height="130%">
                            <xsl:attribute name="font-family">
                                <xsl:choose>
                                    <xsl:when test="$lang = 'zh'">SimSun</xsl:when>
                                    <xsl:otherwise>Cambria</xsl:otherwise>
                                </xsl:choose>
                            </xsl:attribute>
                            <xsl:call-template name="insertTitle">
                                <xsl:with-param name="lang" select="$language"/>
                            </xsl:call-template>
                        </fo:block>
                        <fo:block font-size="14pt" margin-top="28.35pt" margin-bottom="28.35pt">
                            <xsl:variable name="secondlang">
                                <xsl:choose>
                                    <xsl:when test="$language = 'en'">zh</xsl:when>
                                    <xsl:when test="$language = 'zh'">en</xsl:when>
                                </xsl:choose>
                            </xsl:variable>
                            <xsl:if test="$secondlang = 'en'">
                                <xsl:attribute name="font-family">SimHei</xsl:attribute>
                            </xsl:if>
                            <xsl:call-template name="insertTitle">
                                <xsl:with-param name="lang" select="$secondlang"/>
                            </xsl:call-template>
                        </fo:block>
                        <!-- (ISO 17301-1:2016, IDT) -->
                        <fo:block font-size="14pt" margin-top="30pt">
                            <xsl:text> </xsl:text>
                                <xsl:if test="/gb:gb-standard/gb:bibdata/gb:relation[@type='adoptedFrom']/gb:bibitem/gb:docidentifier">
                                    <xsl:text>(</xsl:text>
                                        <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:relation[@type='adoptedFrom']/gb:bibitem/gb:docidentifier"/>
                                        <xsl:text>, </xsl:text>
                                        <xsl:text> IDT</xsl:text>
                                    <xsl:text>)</xsl:text>
                                </xsl:if>
                            <xsl:text> </xsl:text>
                        </fo:block>
                        <!-- (CD) -->
                        <fo:block font-size="12pt" margin-top="30pt">
                            <xsl:text>(</xsl:text>
                            <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:status/gb:stage/@abbreviation"/>
                            <xsl:text>)</xsl:text>
                        </fo:block>
                        <fo:block text-align="justify">
                            <!-- When submitting feedback, please attach any relevant patents that you are aware of, together with supporting documents. -->
                            <xsl:apply-templates select="/gb:gb-standard/gb:boilerplate/gb:legal-statement"/>
                        </fo:block>
                        <fo:block margin-top="9.05pt">
                            <xsl:text>(</xsl:text>
                            <xsl:variable name="title-completion-date">
                                <xsl:choose>
                                    <xsl:when test="$lang = 'zh'">本稿完成日期</xsl:when>
                                    <xsl:otherwise>Completion date for this manuscript</xsl:otherwise>
                                </xsl:choose>
                            </xsl:variable>
                            <xsl:value-of select="$title-completion-date"/>
                            <xsl:text>: </xsl:text>
                                <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:version/gb:revision-date"/>
                            <xsl:text>)</xsl:text>
                        </fo:block>
                    </fo:block-container>
                    <fo:block-container position="absolute" left="0mm" top="239mm" width="170mm" border-bottom="1pt solid black">
                        <fo:block font-family="SimHei" font-size="14pt" text-align-last="justify" margin-bottom="2.5mm">
                            <xsl:variable name="title-issuance-date">
                                <xsl:choose>
                                    <xsl:when test="$lang = 'zh'"># 发布</xsl:when>
                                    <xsl:otherwise>Issuance Date: #</xsl:otherwise>
                                </xsl:choose>
                            </xsl:variable>
                            <xsl:value-of select="java:replaceAll(java:java.lang.String.new($title-issuance-date),'#',/gb:gb-standard/gb:bibdata/gb:date[@type='issued']/gb:on)"/>

                            <fo:inline keep-together.within-line="always">
                                <fo:leader leader-pattern="space"/>
                            </fo:inline>

                            <xsl:variable name="title-implementation-date">
                                <xsl:choose>
                                    <xsl:when test="$lang = 'zh'"># 实施</xsl:when>
                                    <xsl:otherwise>Implementation Date: #</xsl:otherwise>
                                </xsl:choose>
                            </xsl:variable>
                            <xsl:value-of select="java:replaceAll(java:java.lang.String.new($title-implementation-date),'#',/gb:gb-standard/gb:bibdata/gb:date[@type='implemented']/gb:on)"/>

                        </fo:block>
                    </fo:block-container>
                    <fo:block break-after="page"/>
                    <fo:block> </fo:block>
                </fo:flow>
            </fo:page-sequence>

            <fo:page-sequence master-reference="preface" format="I" initial-page-number="1" force-page-count="no-force">
                <xsl:call-template name="insertHeaderFooter"/>
                <fo:flow flow-name="xsl-region-body">
                    <fo:block-container>

                        <fo:block font-family="SimHei" font-size="16pt" margin-top="6pt" margin-bottom="32pt" text-align="center">
                            <xsl:variable name="title-toc">
                                <xsl:call-template name="getTitle">
                                    <xsl:with-param name="name" select="'title-toc'"/>
                                </xsl:call-template>
                            </xsl:variable>
                            <xsl:value-of select="$title-toc"/>
                        </fo:block>

                        <xsl:if test="$debug = 'true'">
                            <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text>
                                DEBUG
                                contents=<xsl:copy-of select="$contents"/>
                            <xsl:text disable-output-escaping="yes">--&gt;</xsl:text>
                        </xsl:if>

                        <fo:block line-height="220%">
                            <xsl:variable name="margin-left">12</xsl:variable>
                            <xsl:for-each select="$contents//item[@display = 'true']"><!-- [@display = 'true'][not(@level = 2 and starts-with(@section, '0'))] skip clause from preface -->
                                <fo:block text-align-last="justify">
                                    <xsl:if test="@level &gt;= 2">
                                        <xsl:attribute name="margin-left"><xsl:value-of select="(@level - 1) * 3.7"/>mm</xsl:attribute>
                                    </xsl:if>
                                    <fo:basic-link internal-destination="{@id}" fox:alt-text="{title}">
                                        <xsl:if test="normalize-space(@section) != ''">
                                            <fo:inline>
                                                <xsl:value-of select="@section"/>
                                            </fo:inline>
                                            <xsl:value-of select="$tab_zh"/>
                                        </xsl:if>
                                        <xsl:apply-templates select="title"/>
                                        <fo:inline keep-together.within-line="always">
                                            <fo:leader font-weight="normal" leader-pattern="dots"/>
                                            <fo:inline><fo:page-number-citation ref-id="{@id}"/></fo:inline>
                                        </fo:inline>
                                    </fo:basic-link>

                                </fo:block>

                            </xsl:for-each>
                        </fo:block>
                    </fo:block-container>

                    <!-- Foreword, Introduction -->
                    <fo:block line-height="150%">
                        <xsl:call-template name="processPrefaceSectionsDefault"/>
                    </fo:block>

                </fo:flow>
            </fo:page-sequence>

            <fo:page-sequence master-reference="document" format="1" initial-page-number="1" force-page-count="no-force">
                <fo:static-content flow-name="xsl-footnote-separator">
                    <fo:block margin-left="7.4mm">
                        <fo:leader leader-pattern="rule" leader-length="30%"/>
                    </fo:block>
                </fo:static-content>
                <xsl:call-template name="insertHeaderFooter"/>
                <fo:flow flow-name="xsl-region-body">
                    <fo:block line-height="150%">

                        <!-- Cereals and pulses—Specifications and test methods—Part 1: Rice -->
                        <fo:block font-family="SimHei" font-size="16pt" text-align="center" line-height="130%" margin-bottom="18pt">
                            <xsl:call-template name="insertTitle">
                                <xsl:with-param name="lang" select="$language"/>
                            </xsl:call-template>
                        </fo:block>

                        <xsl:call-template name="processMainSectionsDefault"/>

                    </fo:block>
                </fo:flow>
            </fo:page-sequence>

            <fo:page-sequence master-reference="last" force-page-count="no-force">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block-container font-size="12pt">
                        <fo:block margin-top="14pt" margin-bottom="14pt">
                            <xsl:value-of select="$standard-name"/>
                        </fo:block>
                        <fo:block margin-top="14pt" margin-bottom="14pt">
                            <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:title[@language = 'zh' and @type = 'title-main']"/>
                        </fo:block>
                        <fo:block margin-top="14pt" margin-bottom="14pt">
                            <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:docidentifier[@type = 'gb']"/>
                        </fo:block>
                    </fo:block-container>
                </fo:flow>
            </fo:page-sequence>

        </fo:root>
    </xsl:template>

    <xsl:template name="insertTitle">
        <xsl:param name="lang" select="'en'"/>
        <xsl:variable name="delimeter">
            <xsl:choose>
                <xsl:when test="$lang = 'zh'"> </xsl:when>
                <xsl:otherwise>—</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:title[@language = $lang and @type='title-intro']"/>
        <xsl:variable name="title-main" select="/gb:gb-standard/gb:bibdata/gb:title[@language = $lang and @type = 'title-main']"/>
        <xsl:if test="normalize-space($title-main) != ''">
            <xsl:value-of select="$delimeter"/>
            <xsl:value-of select="$title-main"/>
        </xsl:if>
        <xsl:variable name="title-part" select="/gb:gb-standard/gb:bibdata/gb:title[@language = $lang and @type = 'title-part']"/>
        <xsl:if test="normalize-space($title-part) != ''">
            <xsl:value-of select="$delimeter"/>
            <xsl:if test="$part != ''">
                <xsl:choose>
                    <xsl:when test="$lang = 'zh'">
                        <xsl:value-of select="java:replaceAll(java:java.lang.String.new($titles/title-part[@lang='zh']),'#',$part)"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:call-template name="getLocalizedString">
                            <xsl:with-param name="key">Part.sg</xsl:with-param>
                        </xsl:call-template>
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="$part"/>
                        <xsl:text>: </xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:if>
            <xsl:value-of select="$title-part"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="node()">
        <xsl:apply-templates/>
    </xsl:template>

    <!-- ============================= -->
    <!-- CONTENTS                                       -->
    <!-- ============================= -->

    <!-- element with title -->
    <xsl:template match="*[gb:title]" mode="contents">
        <xsl:variable name="level">
            <xsl:call-template name="getLevel">
                <xsl:with-param name="depth" select="gb:title/@depth"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:variable name="display">
            <xsl:choose>
                <xsl:when test="$level &lt;= $toc_level">true</xsl:when>
                <xsl:otherwise>false</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="skip">
            <xsl:choose>
                <xsl:when test="ancestor-or-self::gb:bibitem">true</xsl:when>
                <xsl:when test="ancestor-or-self::gb:term">true</xsl:when>
                <xsl:otherwise>false</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:if test="$skip = 'false'">

            <xsl:variable name="section">
                <xsl:call-template name="getSection"/>
            </xsl:variable>

            <xsl:variable name="title">
                <xsl:call-template name="getName"/>
            </xsl:variable>

            <xsl:variable name="type">
                <xsl:value-of select="local-name()"/>
            </xsl:variable>

            <item id="{@id}" level="{$level}" section="{$section}" type="{$type}" display="{$display}">
                <title>
                    <xsl:apply-templates select="xalan:nodeset($title)" mode="contents_item"/>
                </title>
                <xsl:apply-templates mode="contents"/>
            </item>

        </xsl:if>

    </xsl:template>

    <!-- ============================= -->
    <!-- ============================= -->

    <xsl:template match="*[local-name() = 'tab']" priority="2">
        <fo:inline><xsl:value-of select="$tab_zh"/></fo:inline>
    </xsl:template>

    <!-- ====== -->
    <!-- title      -->
    <!-- ====== -->

    <xsl:template match="gb:annex/gb:title">
        <xsl:variable name="level">
            <xsl:call-template name="getLevel"/>
        </xsl:variable>
        <xsl:variable name="font-family">
            <xsl:choose>
                <xsl:when test="$level &gt;= 3">SimSun</xsl:when>
                <xsl:otherwise>SimHei</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <fo:block font-family="{$font-family}" font-size="10.5pt" text-align="center" margin-bottom="24pt" keep-with-next="always">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <!-- Bibliography -->
    <xsl:template match="gb:references[not(@normative='true')]/gb:title">
        <fo:block font-family="SimHei" text-align="center" margin-top="6pt" margin-bottom="16pt" keep-with-next="always">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="gb:title" name="title">

        <xsl:variable name="level">
            <xsl:call-template name="getLevel"/>
        </xsl:variable>

        <xsl:variable name="element-name">
            <xsl:choose>
                <xsl:when test="../@inline-header = 'true'">fo:inline</xsl:when>
                <xsl:otherwise>fo:block</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="font-family">
            <xsl:choose>
                <xsl:when test="ancestor::gb:annex and $level &gt;= 3">SimSun</xsl:when>
                <xsl:when test="$element-name = 'fo:inline'">SimSun</xsl:when>
                <xsl:otherwise>SimHei</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="font-size">
            <xsl:choose>
                <xsl:when test="ancestor::gb:preface">16pt</xsl:when>
                <xsl:otherwise>10.5pt</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:element name="{$element-name}">
            <xsl:attribute name="font-size"><xsl:value-of select="$font-size"/></xsl:attribute>
            <xsl:attribute name="font-family"><xsl:value-of select="$font-family"/></xsl:attribute>
            <xsl:attribute name="margin-top">
                <xsl:choose>
                    <xsl:when test="ancestor::gb:preface">8pt</xsl:when>
                    <xsl:when test="$level = 2 and ancestor::gb:annex">10pt</xsl:when>
                    <xsl:when test="$level = 1">16pt</xsl:when>
                    <xsl:when test="$level = ''">6pt</xsl:when>
                    <xsl:when test="$level &gt;= 5">6pt</xsl:when>
                    <xsl:otherwise>12pt</xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
            <xsl:attribute name="margin-bottom">
                <xsl:choose>
                    <xsl:when test="ancestor::gb:preface">24pt</xsl:when>
                    <xsl:when test="$level = 1">16pt</xsl:when>
                    <xsl:when test="$level &gt;= 5">6pt</xsl:when>
                    <xsl:otherwise>8pt</xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>

            <xsl:attribute name="keep-with-next">always</xsl:attribute>
            <xsl:if test="ancestor::gb:preface">
                <xsl:attribute name="text-align">center</xsl:attribute>
                <xsl:attribute name="font-family">SimHei</xsl:attribute>
            </xsl:if>
            <xsl:if test="$element-name = 'fo:inline'">
                <xsl:attribute name="padding-left">7.4mm</xsl:attribute>
                <xsl:attribute name="font-weight">bold</xsl:attribute>
            </xsl:if>

            <xsl:apply-templates/>

            <xsl:if test="$element-name = 'fo:inline'">
                <xsl:value-of select="$tab_zh"/>
            </xsl:if>

        </xsl:element>

        <xsl:if test="$element-name = 'fo:inline' and not(following-sibling::gb:p)">
            <!-- <fo:block> -->
                <xsl:value-of select="$linebreak"/>
            <!-- </fo:block> -->
        </xsl:if>

    </xsl:template>
    <!-- ====== -->
    <!-- ====== -->

    <xsl:template match="gb:p" name="paragraph">
        <xsl:variable name="previous-element" select="local-name(preceding-sibling::*[1])"/>
        <xsl:variable name="element-name">
            <xsl:choose>
                <xsl:when test="../@inline-header = 'true' and $previous-element = 'title'">fo:inline</xsl:when> <!-- first paragraph after inline title -->
                <xsl:otherwise>fo:block</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:element name="{$element-name}">
            <xsl:attribute name="text-align">
                <xsl:choose>
                    <xsl:when test="@align"><xsl:value-of select="@align"/></xsl:when>
                    <xsl:when test="ancestor::gb:td/@align"><xsl:value-of select="ancestor::gb:td/@align"/></xsl:when>
                    <xsl:when test="ancestor::gb:th/@align"><xsl:value-of select="ancestor::gb:th/@align"/></xsl:when>
                    <xsl:otherwise>justify</xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
            <xsl:attribute name="text-indent">
                <xsl:choose>
                    <xsl:when test="parent::gb:li">0mm</xsl:when>
                    <xsl:when test="parent::gb:dd">0mm</xsl:when>
                    <xsl:otherwise>7.4mm</xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
            <xsl:if test="parent::gb:dd and ancestor::*[local-name()='formula']">
                <xsl:text>— </xsl:text>
            </xsl:if>
            <xsl:apply-templates/>
        </xsl:element>
        <xsl:if test="$element-name = 'fo:inline' and not(local-name(..) = 'admonition')">
            <xsl:value-of select="$linebreak"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="gb:li//gb:p//text()">
        <xsl:choose>
            <xsl:when test="contains(., '&#9;')">
                <fo:inline white-space="pre"><xsl:value-of select="."/></fo:inline>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>

    <xsl:template match="gb:p/gb:fn/gb:p">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="gb:preferred" priority="2">

        <fo:inline font-family="SimHei" font-size="11pt">
            <xsl:if test="not(preceding-sibling::*[1][local-name() = 'preferred'])">
                <xsl:attribute name="padding-left">7.4mm</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/><xsl:value-of select="$tab_zh"/>
        </fo:inline>

        <xsl:if test="not(following-sibling::*[1][local-name() = 'preferred'])">
            <xsl:value-of select="$linebreak"/>
        </xsl:if>

    </xsl:template>

    <xsl:template match="gb:admitted" priority="2">

        <fo:inline font-size="11pt">
            <xsl:if test="not(preceding-sibling::*[1][local-name() = 'admitted'])">
                <xsl:attribute name="padding-left">7.4mm</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/><xsl:value-of select="$tab_zh"/>
        </fo:inline>

        <xsl:if test="not(following-sibling::*[1][local-name() = 'admitted'])">
            <xsl:value-of select="$linebreak"/>
        </xsl:if>

    </xsl:template>

    <xsl:template match="gb:deprecates" priority="2">
        <fo:inline font-size="11pt">
            <xsl:if test="not(preceding-sibling::*[1][local-name() = 'deprecates'])">
                <xsl:attribute name="padding-left">7.4mm</xsl:attribute>
                <xsl:variable name="title-deprecated">
                    <xsl:call-template name="getLocalizedString">
                        <xsl:with-param name="key">deprecated</xsl:with-param>
                    </xsl:call-template>
                </xsl:variable>
                <fo:inline><xsl:value-of select="$title-deprecated"/>: </fo:inline>
            </xsl:if>
            <xsl:apply-templates/>
        </fo:inline>
        <xsl:if test="not(following-sibling::*[1][local-name() = 'deprecates'])">
            <xsl:value-of select="$linebreak"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="gb:termnote" priority="2">
        <fo:block-container font-size="9pt" margin-left="7.4mm" margin-top="4pt" line-height="125%">
            <fo:block-container margin-left="0mm">
                <fo:table table-layout="fixed" width="100%">
                    <fo:table-column column-width="27mm"/>
                    <fo:table-column column-width="138mm"/>
                    <fo:table-body>
                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block font-family="SimHei">
                                    <xsl:apply-templates select="gb:name"/>
                                </fo:block>
                            </fo:table-cell>
                            <fo:table-cell>
                                <fo:block>
                                    <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                    </fo:table-body>
                </fo:table>
            </fo:block-container>
        </fo:block-container>
    </xsl:template>

    <xsl:template match="mathml:math" priority="2">
        <fo:inline font-family="Cambria Math">
            <xsl:variable name="mathml">
                <xsl:apply-templates select="." mode="mathml"/>
            </xsl:variable>
            <fo:instream-foreign-object fox:alt-text="Math">
                <!-- <xsl:copy-of select="."/> -->
                <xsl:copy-of select="xalan:nodeset($mathml)"/>
            </fo:instream-foreign-object>
        </fo:inline>
    </xsl:template>

    <xsl:template name="insertHeaderFooter">
        <fo:static-content flow-name="header">
            <fo:block-container height="30mm" display-align="after">
                <fo:block font-family="SimHei" font-size="12pt">
                    <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:docidentifier[@type = 'gb']"/>
                    <xsl:text>—</xsl:text>
                    <xsl:value-of select="/gb:gb-standard/gb:bibdata/gb:copyright/gb:from"/>
                </fo:block>
            </fo:block-container>
        </fo:static-content>
        <fo:static-content flow-name="footer-odd">
            <fo:block-container height="100%" display-align="after">
                <fo:block-container height="14.5mm" display-align="before">
                    <fo:block font-size="9pt" text-align="right" margin-right="3.5mm">
                        <fo:page-number/>
                    </fo:block>
                </fo:block-container>
            </fo:block-container>
        </fo:static-content>
        <fo:static-content flow-name="footer-even">
            <fo:block-container height="100%" display-align="after">
                <fo:block-container height="14.5mm" display-align="before">
                    <fo:block font-size="9pt">
                        <fo:page-number/>
                    </fo:block>
                </fo:block-container>
            </fo:block-container>
        </fo:static-content>
    </xsl:template>

    <xsl:template name="addLetterSpacing">
        <xsl:param name="text"/>
        <xsl:param name="letter-spacing" select="'0.15'"/>
        <xsl:if test="string-length($text) &gt; 0">
            <xsl:variable name="char" select="substring($text, 1, 1)"/>
            <fo:inline padding-right="{$letter-spacing}mm"><xsl:value-of select="$char"/></fo:inline>
            <xsl:call-template name="addLetterSpacing">
                <xsl:with-param name="text" select="substring($text, 2)"/>
                <xsl:with-param name="letter-spacing" select="$letter-spacing"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <!-- external parameters -->

    <xsl:param name="svg_images"/> <!-- svg images array -->
    <xsl:variable name="images" select="document($svg_images)"/>
    <xsl:param name="basepath"/> <!-- base path for images -->
    <xsl:param name="external_index"/><!-- path to index xml, generated on 1st pass, based on FOP Intermediate Format -->
    <xsl:param name="syntax-highlight">false</xsl:param> <!-- syntax highlighting feature, default - off -->
    <xsl:param name="add_math_as_text">true</xsl:param> <!-- add math in text behind svg formula, to copy-paste formula from PDF as text -->

    <xsl:param name="table_if">false</xsl:param> <!-- generate extended table in IF for autolayout-algorithm -->
    <xsl:param name="table_widths"/> <!-- path to xml with table's widths, generated on 1st pass, based on FOP Intermediate Format -->
    <!-- Example: <tables>
            <table id="table_if_tab-symdu" page-width="75"> - table id prefixed by 'table_if_' to simple search in IF 
                <tbody>
                    <tr>
                        <td id="tab-symdu_1_1">
                            <p_len>6</p_len>
                            <p_len>100</p_len>  for 2nd paragraph
                            <word_len>6</word_len>
                            <word_len>20</word_len>
                        ...
    -->

    <!-- for command line debug: <xsl:variable name="table_widths_from_if" select="document($table_widths)"/> -->
    <xsl:variable name="table_widths_from_if" select="xalan:nodeset($table_widths)"/>

    <xsl:variable name="table_widths_from_if_calculated_">
        <xsl:for-each select="$table_widths_from_if//table">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:call-template name="calculate-column-widths-autolayout-algorithm"/>
            </xsl:copy>
        </xsl:for-each>
    </xsl:variable>
    <xsl:variable name="table_widths_from_if_calculated" select="xalan:nodeset($table_widths_from_if_calculated_)"/>

    <xsl:param name="table_if_debug">false</xsl:param> <!-- set 'true' to put debug width data before table or dl -->

    <xsl:variable name="isApplyAutolayoutAlgorithm_">
        false
    </xsl:variable>
    <xsl:variable name="isApplyAutolayoutAlgorithm" select="normalize-space($isApplyAutolayoutAlgorithm_)"/>

    <xsl:variable name="isGenerateTableIF_">
        <xsl:choose>
            <xsl:when test="$isApplyAutolayoutAlgorithm = 'true'">
                <xsl:value-of select="normalize-space($table_if) = 'true'"/>
            </xsl:when>
            <xsl:otherwise>false</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="isGenerateTableIF" select="normalize-space($isGenerateTableIF_)"/>

    <xsl:variable name="lang">
        <xsl:call-template name="getLang"/>
    </xsl:variable>

    <!-- Note 1: Each xslt has declated variable `namespace` that allows to set some properties, processing logic, etc. for concrete xslt.
    You can put such conditions by using xslt construction `xsl:if test="..."` or <xsl:choose><xsl:when test=""></xsl:when><xsl:otherwiste></xsl:otherwiste></xsl:choose>,
    BUT DON'T put any another conditions together with $namespace = '...' (such conditions will be ignored). For another conditions, please use nested xsl:if or xsl:choose -->

    <!--
    <misc-container>
        <presentation-metadata>
            <papersize>letter</papersize>
        </presentation-metadata>
    </misc-container>
    -->

    <xsl:variable name="papersize" select="java:toLowerCase(java:java.lang.String.new(normalize-space(//*[contains(local-name(), '-standard')]/*[local-name() = 'misc-container']/*[local-name() = 'presentation-metadata']/*[local-name() = 'papersize'])))"/>
    <xsl:variable name="papersize_width_">
        <xsl:choose>
            <xsl:when test="$papersize = 'letter'">215.9</xsl:when>
            <xsl:when test="$papersize = 'a4'">210</xsl:when>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="papersize_width" select="normalize-space($papersize_width_)"/>
    <xsl:variable name="papersize_height_">
        <xsl:choose>
            <xsl:when test="$papersize = 'letter'">279.4</xsl:when>
            <xsl:when test="$papersize = 'a4'">297</xsl:when>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="papersize_height" select="normalize-space($papersize_height_)"/>

    <!-- page width in mm -->
    <xsl:variable name="pageWidth_">
        <xsl:choose>
            <xsl:when test="$papersize_width != ''"><xsl:value-of select="$papersize_width"/></xsl:when>
            <xsl:otherwise>
                210
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="pageWidth" select="normalize-space($pageWidth_)"/>

    <!-- page height in mm -->
    <xsl:variable name="pageHeight_">
        <xsl:choose>
            <xsl:when test="$papersize_height != ''"><xsl:value-of select="$papersize_height"/></xsl:when>
            <xsl:otherwise>
                297
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="pageHeight" select="normalize-space($pageHeight_)"/>

    <!-- Page margins in mm (just digits, without 'mm')-->
    <!-- marginLeftRight1 and marginLeftRight2 - is left or right margin depends on odd/even page,
    for example, left margin on odd page and right margin on even page -->
    <xsl:variable name="marginLeftRight1_">
        25
    </xsl:variable>
    <xsl:variable name="marginLeftRight1" select="normalize-space($marginLeftRight1_)"/>

    <xsl:variable name="marginLeftRight2_">
        20
    </xsl:variable>
    <xsl:variable name="marginLeftRight2" select="normalize-space($marginLeftRight2_)"/>

    <xsl:variable name="marginTop_">
        35
    </xsl:variable>
    <xsl:variable name="marginTop" select="normalize-space($marginTop_)"/>

    <xsl:variable name="marginBottom_">
        20
    </xsl:variable>
    <xsl:variable name="marginBottom" select="normalize-space($marginBottom_)"/>

    <!-- Note 2: almost all localized string determined in the element //localized-strings in metanorma xml, but there are a few cases when:
     - string didn't determined yet
     - we need to put the string on two-languages (for instance, on English and French both), but xml contains only localized strings for one language
     - there is a difference between localized string value and text that should be displayed in PDF
    -->
    <xsl:variable name="titles_">

        <!-- These titles of Table of contents renders different than determined in localized-strings -->
        <title-toc lang="en">

                <xsl:text>Table of contents</xsl:text>

        </title-toc>
        <title-toc lang="fr">
            <xsl:text>Sommaire</xsl:text>
        </title-toc>
        <title-toc lang="zh">

                    <xsl:text>目次</xsl:text>

        </title-toc>

        <title-descriptors lang="en">Descriptors</title-descriptors>

        <title-part lang="en">

                <xsl:text>Part #: </xsl:text>

        </title-part>
        <title-part lang="fr">

                <xsl:text>Partie #:  </xsl:text>

        </title-part>
        <title-part lang="ru">

        </title-part>
        <title-part lang="zh">第 # 部分:</title-part>

        <title-subpart lang="en">Sub-part #</title-subpart>
        <title-subpart lang="fr">Partie de sub #</title-subpart>

        <title-list-tables lang="en">List of Tables</title-list-tables>

        <title-list-figures lang="en">List of Figures</title-list-figures>

        <title-table-figures lang="en">Table of Figures</title-table-figures>

        <title-list-recommendations lang="en">List of Recommendations</title-list-recommendations>

        <title-summary lang="en">Summary</title-summary>

        <title-continued lang="ru">(продолжение)</title-continued>
        <title-continued lang="en">(continued)</title-continued>
        <title-continued lang="fr">(continué)</title-continued>

    </xsl:variable>
    <xsl:variable name="titles" select="xalan:nodeset($titles_)"/>

    <xsl:variable name="title-list-tables">
        <xsl:variable name="toc_table_title" select="//*[contains(local-name(), '-standard')]/*[local-name() = 'misc-container']/*[local-name() = 'toc'][@type='table']/*[local-name() = 'title']"/>
        <xsl:value-of select="$toc_table_title"/>
        <xsl:if test="normalize-space($toc_table_title) = ''">
            <xsl:call-template name="getTitle">
                <xsl:with-param name="name" select="'title-list-tables'"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:variable>

    <xsl:variable name="title-list-figures">
        <xsl:variable name="toc_figure_title" select="//*[contains(local-name(), '-standard')]/*[local-name() = 'misc-container']/*[local-name() = 'toc'][@type='figure']/*[local-name() = 'title']"/>
        <xsl:value-of select="$toc_figure_title"/>
        <xsl:if test="normalize-space($toc_figure_title) = ''">
            <xsl:call-template name="getTitle">
                <xsl:with-param name="name" select="'title-list-figures'"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:variable>

    <xsl:variable name="title-list-recommendations">
        <xsl:variable name="toc_requirement_title" select="//*[contains(local-name(), '-standard')]/*[local-name() = 'misc-container']/*[local-name() = 'toc'][@type='requirement']/*[local-name() = 'title']"/>
        <xsl:value-of select="$toc_requirement_title"/>
        <xsl:if test="normalize-space($toc_requirement_title) = ''">
            <xsl:call-template name="getTitle">
                <xsl:with-param name="name" select="'title-list-recommendations'"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:variable>

    <xsl:variable name="bibdata">
        <xsl:copy-of select="//*[contains(local-name(), '-standard')]/*[local-name() = 'bibdata']"/>
        <xsl:copy-of select="//*[contains(local-name(), '-standard')]/*[local-name() = 'localized-strings']"/>
    </xsl:variable>

    <!-- Characters -->
    <xsl:variable name="linebreak">&#8232;</xsl:variable>
    <xsl:variable name="tab_zh"> </xsl:variable>
    <xsl:variable name="non_breaking_hyphen">‑</xsl:variable>
    <xsl:variable name="thin_space"> </xsl:variable>
    <xsl:variable name="zero_width_space">​</xsl:variable>
    <xsl:variable name="hair_space"> </xsl:variable>
    <xsl:variable name="en_dash">–</xsl:variable>

    <xsl:template name="getTitle">
        <xsl:param name="name"/>
        <xsl:param name="lang"/>
        <xsl:variable name="lang_">
            <xsl:choose>
                <xsl:when test="$lang != ''">
                    <xsl:value-of select="$lang"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:call-template name="getLang"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="language" select="normalize-space($lang_)"/>
        <xsl:variable name="title_" select="$titles/*[local-name() = $name][@lang = $language]"/>
        <xsl:choose>
            <xsl:when test="normalize-space($title_) != ''">
                <xsl:value-of select="$title_"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$titles/*[local-name() = $name][@lang = 'en']"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:variable name="lower">abcdefghijklmnopqrstuvwxyz</xsl:variable>
    <xsl:variable name="upper">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>

    <xsl:variable name="en_chars" select="concat($lower,$upper,',.`1234567890-=~!@#$%^*()_+[]{}\|?/')"/>

    <!-- ====================================== -->
    <!-- STYLES -->
    <!-- ====================================== -->
    <xsl:variable name="font_noto_sans">Noto Sans, Noto Sans HK, Noto Sans JP, Noto Sans KR, Noto Sans SC, Noto Sans TC</xsl:variable>
    <xsl:variable name="font_noto_sans_mono">Noto Sans Mono, Noto Sans Mono CJK HK, Noto Sans Mono CJK JP, Noto Sans Mono CJK KR, Noto Sans Mono CJK SC, Noto Sans Mono CJK TC</xsl:variable>
    <xsl:variable name="font_noto_serif">Noto Serif, Noto Serif HK, Noto Serif JP, Noto Serif KR, Noto Serif SC, Noto Serif TC</xsl:variable>
    <xsl:attribute-set name="root-style">

            <xsl:attribute name="font-family">SimSun</xsl:attribute>
            <xsl:attribute name="font-family-generic">Sans</xsl:attribute>
            <xsl:attribute name="font-size">10.5pt</xsl:attribute>

    </xsl:attribute-set> <!-- root-style -->

    <xsl:template name="insertRootStyle">
        <xsl:param name="root-style"/>
        <xsl:variable name="root-style_" select="xalan:nodeset($root-style)"/>

        <xsl:variable name="additional_fonts_">
            <xsl:for-each select="//*[contains(local-name(), '-standard')][1]/*[local-name() = 'misc-container']/*[local-name() = 'presentation-metadata'][*[local-name() = 'name'] = 'fonts']/*[local-name() = 'value'] |       //*[contains(local-name(), '-standard')][1]/*[local-name() = 'presentation-metadata'][*[local-name() = 'name'] = 'fonts']/*[local-name() = 'value']">
                <xsl:value-of select="."/><xsl:if test="position() != last()">, </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="additional_fonts" select="normalize-space($additional_fonts_)"/>

        <xsl:variable name="font_family_generic" select="$root-style_/root-style/@font-family-generic"/>

        <xsl:for-each select="$root-style_/root-style/@*">

            <xsl:choose>
                <xsl:when test="local-name() = 'font-family-generic'"><!-- skip, it's using for determine 'sans' or 'serif' --></xsl:when>
                <xsl:when test="local-name() = 'font-family'">

                    <xsl:variable name="font_regional_prefix">
                        <xsl:choose>
                            <xsl:when test="$font_family_generic = 'Sans'">Noto Sans</xsl:when>
                            <xsl:otherwise>Noto Serif</xsl:otherwise>
                        </xsl:choose>
                    </xsl:variable>

                    <xsl:attribute name="{local-name()}">

                        <xsl:variable name="font_extended">
                            <xsl:choose>
                                <xsl:when test="$lang = 'zh'"><xsl:value-of select="$font_regional_prefix"/> SC</xsl:when>
                                <xsl:when test="$lang = 'hk'"><xsl:value-of select="$font_regional_prefix"/> HK</xsl:when>
                                <xsl:when test="$lang = 'jp'"><xsl:value-of select="$font_regional_prefix"/> JP</xsl:when>
                                <xsl:when test="$lang = 'kr'"><xsl:value-of select="$font_regional_prefix"/> KR</xsl:when>
                                <xsl:when test="$lang = 'sc'"><xsl:value-of select="$font_regional_prefix"/> SC</xsl:when>
                                <xsl:when test="$lang = 'tc'"><xsl:value-of select="$font_regional_prefix"/> TC</xsl:when>
                            </xsl:choose>
                        </xsl:variable>
                        <xsl:if test="normalize-space($font_extended) != ''">
                            <xsl:value-of select="$font_regional_prefix"/><xsl:text>, </xsl:text>
                            <xsl:value-of select="$font_extended"/><xsl:text>, </xsl:text>
                        </xsl:if>

                        <xsl:value-of select="."/>

                        <xsl:if test="$additional_fonts != ''">
                            <xsl:text>, </xsl:text><xsl:value-of select="$additional_fonts"/>
                        </xsl:if>
                    </xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="."/>
                </xsl:otherwise>
            </xsl:choose>

            <!-- <xsl:choose>
                <xsl:when test="local-name() = 'font-family'">
                    <xsl:attribute name="{local-name()}">
                        <xsl:value-of select="."/>, <xsl:value-of select="$additional_fonts"/>
                    </xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="."/>
                </xsl:otherwise>
            </xsl:choose> -->
        </xsl:for-each>
    </xsl:template> <!-- insertRootStyle -->

    <!-- Preface sections styles -->
    <xsl:attribute-set name="copyright-statement-style">

    </xsl:attribute-set> <!-- copyright-statement-style -->

    <xsl:attribute-set name="copyright-statement-title-style">

    </xsl:attribute-set> <!-- copyright-statement-title-style -->

    <xsl:attribute-set name="copyright-statement-p-style">

    </xsl:attribute-set> <!-- copyright-statement-p-style -->

    <xsl:attribute-set name="license-statement-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="license-statement-title-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>

    </xsl:attribute-set> <!-- license-statement-title-style -->

    <xsl:attribute-set name="license-statement-p-style">

    </xsl:attribute-set> <!-- license-statement-p-style -->

    <xsl:attribute-set name="legal-statement-style">

    </xsl:attribute-set> <!-- legal-statement-style -->

    <xsl:attribute-set name="legal-statement-title-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>

    </xsl:attribute-set> <!-- legal-statement-title-style -->

    <xsl:attribute-set name="legal-statement-p-style">

    </xsl:attribute-set> <!-- legal-statement-p-style -->

    <xsl:attribute-set name="feedback-statement-style">

    </xsl:attribute-set> <!-- feedback-statement-style -->

    <xsl:attribute-set name="feedback-statement-title-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>

    </xsl:attribute-set> <!-- feedback-statement-title-style -->

    <xsl:attribute-set name="feedback-statement-p-style">

    </xsl:attribute-set> <!-- feedback-statement-p-style -->

    <!-- End Preface sections styles -->

    <xsl:attribute-set name="link-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="sourcecode-container-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="sourcecode-style">
        <xsl:attribute name="white-space">pre</xsl:attribute>
        <xsl:attribute name="wrap-option">wrap</xsl:attribute>
        <xsl:attribute name="role">Code</xsl:attribute>

            <xsl:attribute name="font-family">Courier New, <xsl:value-of select="$font_noto_sans_mono"/></xsl:attribute>
            <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="permission-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="permission-name-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="permission-label-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="requirement-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="requirement-name-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="requirement-label-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="subject-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="inherit-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="description-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="specification-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="measurement-target-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="verification-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="import-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="component-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="recommendation-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="recommendation-name-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="recommendation-label-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="termexample-style">

            <xsl:attribute name="font-size">9pt</xsl:attribute>
            <xsl:attribute name="margin-top">14pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">14pt</xsl:attribute>
            <xsl:attribute name="text-align">justify</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="example-style">

            <xsl:attribute name="font-size">10pt</xsl:attribute>
            <xsl:attribute name="margin-top">8pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">8pt</xsl:attribute>

    </xsl:attribute-set> <!-- example-style -->

    <xsl:attribute-set name="example-body-style">

    </xsl:attribute-set> <!-- example-body-style -->

    <xsl:attribute-set name="example-name-style">

            <xsl:attribute name="keep-with-next">always</xsl:attribute>
            <xsl:attribute name="padding-right">5mm</xsl:attribute>
            <xsl:attribute name="margin-bottom">6pt</xsl:attribute>

    </xsl:attribute-set> <!-- example-name-style -->

    <xsl:attribute-set name="example-p-style">

            <xsl:attribute name="font-size">10pt</xsl:attribute>
            <xsl:attribute name="margin-top">8pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">8pt</xsl:attribute>

    </xsl:attribute-set> <!-- example-p-style -->

    <xsl:attribute-set name="termexample-name-style">

            <xsl:attribute name="padding-right">1mm</xsl:attribute>
            <xsl:attribute name="font-family">SimHei</xsl:attribute>

    </xsl:attribute-set> <!-- termexample-name-style -->

    <!-- ========================== -->
    <!-- Table styles -->
    <!-- ========================== -->
    <xsl:variable name="table-border_">

    </xsl:variable>
    <xsl:variable name="table-border" select="normalize-space($table-border_)"/>

    <xsl:attribute-set name="table-container-style">
        <xsl:attribute name="margin-left">0mm</xsl:attribute>
        <xsl:attribute name="margin-right">0mm</xsl:attribute>

            <xsl:attribute name="font-size">10pt</xsl:attribute>

    </xsl:attribute-set> <!-- table-container-style -->

    <xsl:attribute-set name="table-style">
        <xsl:attribute name="table-omit-footer-at-break">true</xsl:attribute>
        <xsl:attribute name="table-layout">fixed</xsl:attribute>
        <xsl:attribute name="margin-left">0mm</xsl:attribute>
        <xsl:attribute name="margin-right">0mm</xsl:attribute>

    </xsl:attribute-set><!-- table-style -->

    <xsl:attribute-set name="table-name-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>

            <xsl:attribute name="text-align">center</xsl:attribute>
            <xsl:attribute name="font-family">SimHei</xsl:attribute>
            <xsl:attribute name="font-weight">normal</xsl:attribute>
            <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

    </xsl:attribute-set> <!-- table-name-style -->

    <xsl:attribute-set name="table-row-style">
        <xsl:attribute name="min-height">4mm</xsl:attribute>

            <xsl:attribute name="min-height">0mm</xsl:attribute>
            <xsl:attribute name="line-height">110%</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="table-header-row-style" use-attribute-sets="table-row-style">
        <xsl:attribute name="font-weight">bold</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="table-footer-row-style" use-attribute-sets="table-row-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="table-body-row-style" use-attribute-sets="table-row-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="table-header-cell-style">
        <xsl:attribute name="font-weight">bold</xsl:attribute>
        <xsl:attribute name="border">solid black 1pt</xsl:attribute>
        <xsl:attribute name="padding-left">1mm</xsl:attribute>
        <xsl:attribute name="padding-right">1mm</xsl:attribute>
        <xsl:attribute name="display-align">center</xsl:attribute>

    </xsl:attribute-set> <!-- table-header-cell-style -->

    <xsl:attribute-set name="table-cell-style">
        <xsl:attribute name="display-align">center</xsl:attribute>
        <xsl:attribute name="border">solid black 1pt</xsl:attribute>
        <xsl:attribute name="padding-left">1mm</xsl:attribute>
        <xsl:attribute name="padding-right">1mm</xsl:attribute>

    </xsl:attribute-set> <!-- table-cell-style -->

    <xsl:attribute-set name="table-footer-cell-style">
        <xsl:attribute name="border">solid black 1pt</xsl:attribute>
        <xsl:attribute name="padding-left">1mm</xsl:attribute>
        <xsl:attribute name="padding-right">1mm</xsl:attribute>
        <xsl:attribute name="padding-top">1mm</xsl:attribute>

            <xsl:attribute name="border-top">solid black 0pt</xsl:attribute>

    </xsl:attribute-set> <!-- table-footer-cell-style -->

    <xsl:attribute-set name="table-note-style">
        <xsl:attribute name="font-size">10pt</xsl:attribute>
        <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

            <xsl:attribute name="font-size">9pt</xsl:attribute>
            <xsl:attribute name="text-align">center</xsl:attribute>
            <xsl:attribute name="margin-bottom">6pt</xsl:attribute>

    </xsl:attribute-set><!-- table-note-style -->

    <xsl:attribute-set name="table-fn-style">
        <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

            <xsl:attribute name="text-indent">7.4mm</xsl:attribute>
            <xsl:attribute name="margin-bottom">0pt</xsl:attribute>
            <xsl:attribute name="line-height">130%</xsl:attribute>

    </xsl:attribute-set> <!-- table-fn-style -->

    <xsl:attribute-set name="table-fn-number-style">
        <xsl:attribute name="font-size">80%</xsl:attribute>
        <xsl:attribute name="padding-right">5mm</xsl:attribute>

            <xsl:attribute name="font-size">50%</xsl:attribute>
            <xsl:attribute name="vertical-align">super</xsl:attribute>

    </xsl:attribute-set> <!-- table-fn-number-style -->

    <xsl:attribute-set name="fn-container-body-style">
        <xsl:attribute name="text-indent">0</xsl:attribute>
        <xsl:attribute name="start-indent">0</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="table-fn-body-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="figure-fn-number-style">
        <xsl:attribute name="font-size">80%</xsl:attribute>
        <xsl:attribute name="padding-right">5mm</xsl:attribute>
        <xsl:attribute name="vertical-align">super</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="figure-fn-body-style">
        <xsl:attribute name="text-align">justify</xsl:attribute>
        <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

    </xsl:attribute-set>
    <!-- ========================== -->
    <!-- END Table styles -->
    <!-- ========================== -->

    <!-- ========================== -->
    <!-- Definition's list styles -->
    <!-- ========================== -->
    <xsl:attribute-set name="dt-row-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="dt-cell-style">
    </xsl:attribute-set>

    <xsl:attribute-set name="dt-block-style">
        <xsl:attribute name="margin-top">0pt</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="dl-name-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>
        <xsl:attribute name="margin-bottom">6pt</xsl:attribute>

            <xsl:attribute name="font-weight">normal</xsl:attribute>

    </xsl:attribute-set> <!-- dl-name-style -->

    <xsl:attribute-set name="dd-cell-style">
        <xsl:attribute name="padding-left">2mm</xsl:attribute>
    </xsl:attribute-set>

    <!-- ========================== -->
    <!-- END Definition's list styles -->
    <!-- ========================== -->

    <xsl:attribute-set name="appendix-style">

            <xsl:attribute name="font-size">12pt</xsl:attribute>
            <xsl:attribute name="font-weight">bold</xsl:attribute>
            <xsl:attribute name="margin-top">12pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="appendix-example-style">

            <xsl:attribute name="font-size">10pt</xsl:attribute>
            <xsl:attribute name="margin-top">8pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">8pt</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="xref-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="eref-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="note-style">

            <xsl:attribute name="font-size">9pt</xsl:attribute>
            <xsl:attribute name="margin-left">7.4mm</xsl:attribute>
            <xsl:attribute name="margin-top">4pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">4pt</xsl:attribute>
            <xsl:attribute name="line-height">125%</xsl:attribute>

    </xsl:attribute-set>

    <xsl:variable name="note-body-indent">10mm</xsl:variable>
    <xsl:variable name="note-body-indent-table">5mm</xsl:variable>

    <xsl:attribute-set name="note-name-style">

            <xsl:attribute name="font-family">SimHei</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="table-note-name-style">
        <xsl:attribute name="padding-right">2mm</xsl:attribute>

            <xsl:attribute name="font-family">SimHei</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="note-p-style">

            <xsl:attribute name="margin-top">4pt</xsl:attribute>
            <xsl:attribute name="line-height">125%</xsl:attribute>
            <xsl:attribute name="text-align">justify</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="termnote-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="termnote-name-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="termnote-p-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="quote-style">
        <xsl:attribute name="margin-left">12mm</xsl:attribute>
        <xsl:attribute name="margin-right">12mm</xsl:attribute>

            <xsl:attribute name="margin-top">12pt</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="quote-source-style">
        <xsl:attribute name="text-align">right</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="termsource-style">

            <xsl:attribute name="text-indent">7.4mm</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="termsource-text-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="origin-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="term-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="term-name-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>
        <xsl:attribute name="font-weight">bold</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="figure-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="figure-name-style">

            <xsl:attribute name="font-family">SimHei</xsl:attribute>
            <xsl:attribute name="text-align">center</xsl:attribute>
            <xsl:attribute name="margin-top">12pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">12pt</xsl:attribute>
            <xsl:attribute name="keep-with-previous">always</xsl:attribute>

    </xsl:attribute-set>

    <!-- Formula's styles -->
    <xsl:attribute-set name="formula-style">
        <xsl:attribute name="margin-top">6pt</xsl:attribute>
        <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

            <xsl:attribute name="margin-top">14pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">14pt</xsl:attribute>

    </xsl:attribute-set> <!-- formula-style -->

    <xsl:attribute-set name="formula-stem-block-style">
        <xsl:attribute name="text-align">center</xsl:attribute>

            <xsl:attribute name="text-align">center</xsl:attribute>

    </xsl:attribute-set> <!-- formula-stem-block-style -->

    <xsl:attribute-set name="formula-stem-number-style">
        <xsl:attribute name="text-align">right</xsl:attribute>

            <xsl:attribute name="text-align">left</xsl:attribute>

    </xsl:attribute-set> <!-- formula-stem-number-style -->
    <!-- End Formula's styles -->

    <xsl:attribute-set name="image-style">
        <xsl:attribute name="text-align">center</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="figure-pseudocode-p-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="image-graphic-style">
        <xsl:attribute name="width">100%</xsl:attribute>
        <xsl:attribute name="content-height">100%</xsl:attribute>
        <xsl:attribute name="scaling">uniform</xsl:attribute>

            <xsl:attribute name="content-width">scale-to-fit</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="tt-style">

            <xsl:attribute name="font-family">Courier New, <xsl:value-of select="$font_noto_sans_mono"/></xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="sourcecode-name-style">
        <xsl:attribute name="font-size">11pt</xsl:attribute>
        <xsl:attribute name="font-weight">bold</xsl:attribute>
        <xsl:attribute name="text-align">center</xsl:attribute>
        <xsl:attribute name="margin-bottom">12pt</xsl:attribute>
        <xsl:attribute name="keep-with-previous">always</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="preferred-block-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="preferred-term-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>
        <xsl:attribute name="font-weight">bold</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="domain-style">

            <xsl:attribute name="padding-left">7.4mm</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="admitted-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="deprecates-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="definition-style">

    </xsl:attribute-set>

    <xsl:variable name="color-added-text">
        <xsl:text>rgb(0, 255, 0)</xsl:text>
    </xsl:variable>
    <xsl:attribute-set name="add-style">

                <xsl:attribute name="color">red</xsl:attribute>
                <xsl:attribute name="text-decoration">underline</xsl:attribute>
                <!-- <xsl:attribute name="color">black</xsl:attribute>
                <xsl:attribute name="background-color"><xsl:value-of select="$color-added-text"/></xsl:attribute>
                <xsl:attribute name="padding-top">1mm</xsl:attribute>
                <xsl:attribute name="padding-bottom">0.5mm</xsl:attribute> -->

    </xsl:attribute-set>

    <xsl:variable name="add-style">
            <add-style xsl:use-attribute-sets="add-style"/>
        </xsl:variable>
    <xsl:template name="append_add-style">
        <xsl:copy-of select="xalan:nodeset($add-style)/add-style/@*"/>
    </xsl:template>

    <xsl:variable name="color-deleted-text">
        <xsl:text>red</xsl:text>
    </xsl:variable>
    <xsl:attribute-set name="del-style">
        <xsl:attribute name="color"><xsl:value-of select="$color-deleted-text"/></xsl:attribute>
        <xsl:attribute name="text-decoration">line-through</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="mathml-style">
        <xsl:attribute name="font-family">STIX Two Math</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="list-style">

            <xsl:attribute name="provisional-distance-between-starts">4mm</xsl:attribute>
            <xsl:attribute name="margin-left">7.4mm</xsl:attribute>
            <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

    </xsl:attribute-set> <!-- list-style -->

    <xsl:attribute-set name="list-name-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>

            <xsl:attribute name="font-weight">normal</xsl:attribute>

    </xsl:attribute-set> <!-- list-name-style -->

    <xsl:attribute-set name="list-item-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="list-item-label-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="list-item-body-style">

    </xsl:attribute-set>

    <xsl:attribute-set name="toc-style">
        <xsl:attribute name="line-height">135%</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="fn-reference-style">
        <xsl:attribute name="font-size">80%</xsl:attribute>
        <xsl:attribute name="keep-with-previous.within-line">always</xsl:attribute>

            <xsl:attribute name="font-size">50%</xsl:attribute>
            <xsl:attribute name="font-weight">normal</xsl:attribute>
            <xsl:attribute name="vertical-align">super</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="fn-style">
        <xsl:attribute name="keep-with-previous.within-line">always</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="fn-num-style">
        <xsl:attribute name="keep-with-previous.within-line">always</xsl:attribute>

            <xsl:attribute name="font-size">60%</xsl:attribute>
            <xsl:attribute name="vertical-align">super</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="fn-body-style">
        <xsl:attribute name="font-weight">normal</xsl:attribute>
        <xsl:attribute name="font-style">normal</xsl:attribute>
        <xsl:attribute name="text-indent">0</xsl:attribute>
        <xsl:attribute name="start-indent">0</xsl:attribute>

            <xsl:attribute name="font-size">9pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="fn-body-num-style">
        <xsl:attribute name="keep-with-next.within-line">always</xsl:attribute>

            <xsl:attribute name="font-size">50%</xsl:attribute>
            <xsl:attribute name="vertical-align">super</xsl:attribute>

    </xsl:attribute-set> <!-- fn-body-num-style -->

    <!-- admonition -->
    <xsl:attribute-set name="admonition-style">

    </xsl:attribute-set> <!-- admonition-style -->

    <xsl:attribute-set name="admonition-container-style">
        <xsl:attribute name="margin-left">0mm</xsl:attribute>
        <xsl:attribute name="margin-right">0mm</xsl:attribute>

    </xsl:attribute-set> <!-- admonition-container-style -->

    <xsl:attribute-set name="admonition-name-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>

            <xsl:attribute name="font-family">SimHei</xsl:attribute>
            <xsl:attribute name="text-align">center</xsl:attribute>
            <xsl:attribute name="margin-bottom">12pt</xsl:attribute>
            <xsl:attribute name="font-weight">bold</xsl:attribute>

    </xsl:attribute-set> <!-- admonition-name-style -->

    <xsl:attribute-set name="admonition-p-style">

            <xsl:attribute name="font-weight">bold</xsl:attribute>

    </xsl:attribute-set> <!-- admonition-p-style -->
    <!-- end admonition -->

    <!-- bibitem in Normative References (references/@normative="true") -->
    <xsl:attribute-set name="bibitem-normative-style">

            <xsl:attribute name="font-size">11pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">12pt</xsl:attribute>
            <xsl:attribute name="text-indent">-11.7mm</xsl:attribute>
            <xsl:attribute name="margin-left">11.7mm</xsl:attribute>

    </xsl:attribute-set> <!-- bibitem-normative-style -->

    <!-- bibitem in Normative References (references/@normative="true"), renders as list -->
    <xsl:attribute-set name="bibitem-normative-list-style">
        <xsl:attribute name="provisional-distance-between-starts">12mm</xsl:attribute>
        <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

            <xsl:attribute name="font-size">11pt</xsl:attribute>

        <!-- <xsl:if test="$namespace = 'ieee'">
            <xsl:attribute name="margin-bottom">6pt</xsl:attribute>
            <xsl:attribute name="provisional-distance-between-starts">9.5mm</xsl:attribute>
        </xsl:if> -->

    </xsl:attribute-set> <!-- bibitem-normative-list-style -->

    <xsl:attribute-set name="bibitem-non-normative-style">

    </xsl:attribute-set> <!-- bibitem-non-normative-style -->

    <!-- bibitem in bibliography section (references/@normative="false"), renders as list -->
    <xsl:attribute-set name="bibitem-non-normative-list-style">
        <xsl:attribute name="provisional-distance-between-starts">12mm</xsl:attribute>
        <xsl:attribute name="margin-bottom">12pt</xsl:attribute>

            <xsl:attribute name="font-size">11pt</xsl:attribute>

    </xsl:attribute-set> <!-- bibitem-non-normative-list-style -->

    <!-- bibitem in bibliography section (references/@normative="false"), list body -->
    <xsl:attribute-set name="bibitem-normative-list-body-style">

            <xsl:attribute name="text-align">justify</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="bibitem-non-normative-list-body-style">

            <xsl:attribute name="text-align">justify</xsl:attribute>

    </xsl:attribute-set> <!-- bibitem-non-normative-list-body-style -->

    <!-- footnote reference number for bibitem, in the text  -->
    <xsl:attribute-set name="bibitem-note-fn-style">
        <xsl:attribute name="keep-with-previous.within-line">always</xsl:attribute>
        <xsl:attribute name="font-size">65%</xsl:attribute>

            <xsl:attribute name="font-size">50%</xsl:attribute>
            <xsl:attribute name="baseline-shift">30%</xsl:attribute>

    </xsl:attribute-set> <!-- bibitem-note-fn-style -->

    <!-- footnote number on the page bottom -->
    <xsl:attribute-set name="bibitem-note-fn-number-style">
        <xsl:attribute name="keep-with-next.within-line">always</xsl:attribute>

            <xsl:attribute name="font-size">50%</xsl:attribute>
            <xsl:attribute name="baseline-shift">30%</xsl:attribute>

    </xsl:attribute-set> <!-- bibitem-note-fn-number-style -->

    <!-- footnote body (text) on the page bottom -->
    <xsl:attribute-set name="bibitem-note-fn-body-style">
        <xsl:attribute name="font-size">10pt</xsl:attribute>
        <xsl:attribute name="margin-bottom">12pt</xsl:attribute>
        <xsl:attribute name="start-indent">0pt</xsl:attribute>

            <xsl:attribute name="font-size">9pt</xsl:attribute>
            <xsl:attribute name="margin-bottom">4pt</xsl:attribute>
            <xsl:attribute name="text-indent">7.4mm</xsl:attribute>

    </xsl:attribute-set> <!-- bibitem-note-fn-body-style -->

    <xsl:attribute-set name="references-non-normative-style">

    </xsl:attribute-set> <!-- references-non-normative-style -->

    <!-- Highlight.js syntax GitHub styles -->
    <xsl:attribute-set name="hljs-doctag">
        <xsl:attribute name="color">#d73a49</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-keyword">
        <xsl:attribute name="color">#d73a49</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-meta_hljs-keyword">
        <xsl:attribute name="color">#d73a49</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-template-tag">
        <xsl:attribute name="color">#d73a49</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-template-variable">
        <xsl:attribute name="color">#d73a49</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-type">
        <xsl:attribute name="color">#d73a49</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-variable_and_language_">
        <xsl:attribute name="color">#d73a49</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-title">
        <xsl:attribute name="color">#6f42c1</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-title_and_class_">
        <xsl:attribute name="color">#6f42c1</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-title_and_class__and_inherited__">
        <xsl:attribute name="color">#6f42c1</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-title_and_function_">
        <xsl:attribute name="color">#6f42c1</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-attr">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-attribute">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-literal">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-meta">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-number">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-operator">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-variable">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-selector-attr">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-selector-class">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-selector-id">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-regexp">
        <xsl:attribute name="color">#032f62</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-string">
        <xsl:attribute name="color">#032f62</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-meta_hljs-string">
        <xsl:attribute name="color">#032f62</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-built_in">
        <xsl:attribute name="color">#e36209</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-symbol">
        <xsl:attribute name="color">#e36209</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-comment">
        <xsl:attribute name="color">#6a737d</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-code">
        <xsl:attribute name="color">#6a737d</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-formula">
        <xsl:attribute name="color">#6a737d</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-name">
        <xsl:attribute name="color">#22863a</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-quote">
        <xsl:attribute name="color">#22863a</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-selector-tag">
        <xsl:attribute name="color">#22863a</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-selector-pseudo">
        <xsl:attribute name="color">#22863a</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-subst">
        <xsl:attribute name="color">#24292e</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-section">
        <xsl:attribute name="color">#005cc5</xsl:attribute>
        <xsl:attribute name="font-weight">bold</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-bullet">
        <xsl:attribute name="color">#735c0f</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-emphasis">
        <xsl:attribute name="color">#24292e</xsl:attribute>
        <xsl:attribute name="font-style">italic</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-strong">
        <xsl:attribute name="color">#24292e</xsl:attribute>
        <xsl:attribute name="font-weight">bold</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-addition">
        <xsl:attribute name="color">#22863a</xsl:attribute>
        <xsl:attribute name="background-color">#f0fff4</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-deletion">
        <xsl:attribute name="color">#b31d28</xsl:attribute>
        <xsl:attribute name="background-color">#ffeef0</xsl:attribute>
    </xsl:attribute-set>

    <xsl:attribute-set name="hljs-char_and_escape_">
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-link">
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-params">
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-property">
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-punctuation">
    </xsl:attribute-set>
    <xsl:attribute-set name="hljs-tag">
    </xsl:attribute-set>
    <!-- End Highlight syntax styles -->

    <!-- Index section styles -->
    <xsl:attribute-set name="indexsect-title-style">
        <xsl:attribute name="role">H1</xsl:attribute>

    </xsl:attribute-set>

    <xsl:attribute-set name="indexsect-clause-title-style">
        <xsl:attribute name="keep-with-next">always</xsl:attribute>

    </xsl:attribute-set>

    <!-- End Index section styles -->
    <!-- ====================================== -->
    <!-- END STYLES -->
    <!-- ====================================== -->

    <xsl:variable name="border-block-added">2.5pt solid rgb(0, 176, 80)</xsl:variable>
    <xsl:variable name="border-block-deleted">2.5pt solid rgb(255, 0, 0)</xsl:variable>

    <xsl:variable name="ace_tag">ace-tag_</xsl:variable>

    <xsl:template name="processPrefaceSectionsDefault_Contents">
        <xsl:variable name="nodes_preface_">
            <xsl:for-each select="/*/*[local-name()='preface']/*[not(local-name() = 'note' or local-name() = 'admonition')]">
                <node id="{@id}"/>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="nodes_preface" select="xalan:nodeset($nodes_preface_)"/>

        <xsl:for-each select="/*/*[local-name()='preface']/*[not(local-name() = 'note' or local-name() = 'admonition')]">
            <xsl:sort select="@displayorder" data-type="number"/>

            <!-- process Section's title -->
            <xsl:variable name="preceding-sibling_id" select="$nodes_preface/node[@id = current()/@id]/preceding-sibling::node[1]/@id"/>
            <xsl:if test="$preceding-sibling_id != ''">
                <xsl:apply-templates select="parent::*/*[@type = 'section-title' and @id = $preceding-sibling_id and not(@displayorder)]" mode="contents_no_displayorder"/>
            </xsl:if>

            <xsl:apply-templates select="." mode="contents"/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="processMainSectionsDefault_Contents">

        <xsl:variable name="nodes_sections_">
            <xsl:for-each select="/*/*[local-name()='sections']/*">
                <node id="{@id}"/>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="nodes_sections" select="xalan:nodeset($nodes_sections_)"/>

        <xsl:for-each select="/*/*[local-name()='sections']/* | /*/*[local-name()='bibliography']/*[local-name()='references'][@normative='true'] |    /*/*[local-name()='bibliography']/*[local-name()='clause'][*[local-name()='references'][@normative='true']]">
            <xsl:sort select="@displayorder" data-type="number"/>

            <!-- process Section's title -->
            <xsl:variable name="preceding-sibling_id" select="$nodes_sections/node[@id = current()/@id]/preceding-sibling::node[1]/@id"/>
            <xsl:if test="$preceding-sibling_id != ''">
                <xsl:apply-templates select="parent::*/*[@type = 'section-title' and @id = $preceding-sibling_id and not(@displayorder)]" mode="contents_no_displayorder"/>
            </xsl:if>

            <xsl:apply-templates select="." mode="contents"/>
        </xsl:for-each>

        <xsl:for-each select="/*/*[local-name()='annex']">
            <xsl:sort select="@displayorder" data-type="number"/>
            <xsl:apply-templates select="." mode="contents"/>
        </xsl:for-each>

        <xsl:for-each select="/*/*[local-name()='bibliography']/*[not(@normative='true') and not(*[local-name()='references'][@normative='true'])] |          /*/*[local-name()='bibliography']/*[local-name()='clause'][*[local-name()='references'][not(@normative='true')]]">
            <xsl:sort select="@displayorder" data-type="number"/>
            <xsl:apply-templates select="." mode="contents"/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="processTablesFigures_Contents">
        <xsl:param name="always"/>
        <xsl:if test="(//*[contains(local-name(), '-standard')]/*[local-name() = 'misc-container']/*[local-name() = 'toc'][@type='table']/*[local-name() = 'title']) or normalize-space($always) = 'true'">
            <xsl:call-template name="processTables_Contents"/>
        </xsl:if>
        <xsl:if test="(//*[contains(local-name(), '-standard')]/*[local-name() = 'misc-container']/*[local-name() = 'toc'][@type='figure']/*[local-name() = 'title']) or normalize-space($always) = 'true'">
            <xsl:call-template name="processFigures_Contents"/>
        </xsl:if>
    </xsl:template>

    <xsl:template name="processTables_Contents">
        <tables>
            <xsl:for-each select="//*[local-name() = 'table'][@id and *[local-name() = 'name'] and normalize-space(@id) != '']">
                <table id="{@id}" alt-text="{*[local-name() = 'name']}">
                    <xsl:copy-of select="*[local-name() = 'name']"/>
                </table>
            </xsl:for-each>
        </tables>
    </xsl:template>

    <xsl:template name="processFigures_Contents">
        <figures>
            <xsl:for-each select="//*[local-name() = 'figure'][@id and *[local-name() = 'name'] and not(@unnumbered = 'true') and normalize-space(@id) != ''] | //*[@id and starts-with(*[local-name() = 'name'], 'Figure ') and normalize-space(@id) != '']">
                <figure id="{@id}" alt-text="{*[local-name() = 'name']}">
                    <xsl:copy-of select="*[local-name() = 'name']"/>
                </figure>
            </xsl:for-each>
        </figures>
    </xsl:template>

    <xsl:template name="processPrefaceSectionsDefault">
        <xsl:for-each select="/*/*[local-name()='preface']/*[not(local-name() = 'note' or local-name() = 'admonition')]">
            <xsl:sort select="@displayorder" data-type="number"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="processMainSectionsDefault">
        <xsl:for-each select="/*/*[local-name()='sections']/* | /*/*[local-name()='bibliography']/*[local-name()='references'][@normative='true']">
            <xsl:sort select="@displayorder" data-type="number"/>
            <xsl:apply-templates select="."/>

        </xsl:for-each>

        <xsl:for-each select="/*/*[local-name()='annex']">
            <xsl:sort select="@displayorder" data-type="number"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>

        <xsl:for-each select="/*/*[local-name()='bibliography']/*[not(@normative='true')] |          /*/*[local-name()='bibliography']/*[local-name()='clause'][*[local-name()='references'][not(@normative='true')]]">
            <xsl:sort select="@displayorder" data-type="number"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>
    </xsl:template>

    <xsl:variable name="tag_fo_inline_keep-together_within-line_open">###fo:inline keep-together_within-line###</xsl:variable>
    <xsl:variable name="tag_fo_inline_keep-together_within-line_close">###/fo:inline keep-together_within-line###</xsl:variable>
    <xsl:template match="text()" name="text">

                <xsl:variable name="regex_standard_reference">([A-Z]{2,}(/[A-Z]{2,})* \d+(-\d+)*(:\d{4})?)</xsl:variable>
                <xsl:variable name="text" select="java:replaceAll(java:java.lang.String.new(.),$regex_standard_reference,concat($tag_fo_inline_keep-together_within-line_open,'$1',$tag_fo_inline_keep-together_within-line_close))"/>
                <xsl:call-template name="replace_fo_inline_tags">
                    <xsl:with-param name="tag_open" select="$tag_fo_inline_keep-together_within-line_open"/>
                    <xsl:with-param name="tag_close" select="$tag_fo_inline_keep-together_within-line_close"/>
                    <xsl:with-param name="text" select="$text"/>
                </xsl:call-template>

    </xsl:template>

    <xsl:template name="replace_fo_inline_tags">
        <xsl:param name="tag_open"/>
        <xsl:param name="tag_close"/>
        <xsl:param name="text"/>
        <xsl:choose>
            <xsl:when test="contains($text, $tag_open)">
                <xsl:value-of select="substring-before($text, $tag_open)"/>
                <!-- <xsl:text disable-output-escaping="yes">&lt;fo:inline keep-together.within-line="always"&gt;</xsl:text> -->
                <xsl:variable name="text_after" select="substring-after($text, $tag_open)"/>
                <fo:inline keep-together.within-line="always">
                    <xsl:value-of select="substring-before($text_after, $tag_close)"/>
                </fo:inline>
                <!-- <xsl:text disable-output-escaping="yes">&lt;/fo:inline&gt;</xsl:text> -->
                <xsl:call-template name="replace_fo_inline_tags">
                    <xsl:with-param name="tag_open" select="$tag_open"/>
                    <xsl:with-param name="tag_close" select="$tag_close"/>
                    <xsl:with-param name="text" select="substring-after($text_after, $tag_close)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise><xsl:value-of select="$text"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="*[local-name()='br']">
        <xsl:value-of select="$linebreak"/>
    </xsl:template>

    <!-- keep-together for standard's name (ISO 12345:2020) -->
    <xsl:template match="*[local-name() = 'keep-together_within-line']">
        <xsl:param name="split_keep-within-line"/>

        <!-- <fo:inline>split_keep-within-line='<xsl:value-of select="$split_keep-within-line"/>'</fo:inline> -->
        <xsl:choose>

            <xsl:when test="normalize-space($split_keep-within-line) = 'true'">
                <xsl:variable name="sep">_</xsl:variable>
                <xsl:variable name="items">
                    <xsl:call-template name="split">
                        <xsl:with-param name="pText" select="."/>
                        <xsl:with-param name="sep" select="$sep"/>
                        <xsl:with-param name="normalize-space">false</xsl:with-param>
                        <xsl:with-param name="keep_sep">true</xsl:with-param>
                    </xsl:call-template>
                </xsl:variable>
                <xsl:for-each select="xalan:nodeset($items)/item">
                    <xsl:choose>
                        <xsl:when test=". = $sep">
                            <xsl:value-of select="$sep"/><xsl:value-of select="$zero_width_space"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <fo:inline keep-together.within-line="always"><xsl:apply-templates/></fo:inline>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each>
            </xsl:when>

            <xsl:otherwise>
                <fo:inline keep-together.within-line="always"><xsl:apply-templates/></fo:inline>
            </xsl:otherwise>

        </xsl:choose>
    </xsl:template>

    <!-- ================================= -->
    <!-- Preface boilerplate sections processing -->
    <!-- ================================= -->
    <xsl:template match="*[local-name()='copyright-statement']">
        <fo:block xsl:use-attribute-sets="copyright-statement-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template> <!-- copyright-statement -->

    <xsl:template match="*[local-name()='copyright-statement']//*[local-name()='title']">

                <!-- process in the template 'title' -->
                <xsl:call-template name="title"/>

    </xsl:template> <!-- copyright-statement//title -->

    <xsl:template match="*[local-name()='copyright-statement']//*[local-name()='p']">

                <!-- process in the template 'paragraph' -->
                <xsl:call-template name="paragraph"/>

    </xsl:template> <!-- copyright-statement//p -->

    <xsl:template match="*[local-name()='license-statement']">
        <fo:block xsl:use-attribute-sets="license-statement-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template> <!-- license-statement -->

    <xsl:template match="*[local-name()='license-statement']//*[local-name()='title']">

                <!-- process in the template 'title' -->
                <xsl:call-template name="title"/>

    </xsl:template> <!-- license-statement/title -->

    <xsl:template match="*[local-name()='license-statement']//*[local-name()='p']">

                <!-- process in the template 'paragraph' -->
                <xsl:call-template name="paragraph"/>

    </xsl:template> <!-- license-statement/p -->

    <xsl:template match="*[local-name()='legal-statement']">
        <fo:block xsl:use-attribute-sets="legal-statement-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template> <!-- legal-statement -->

    <xsl:template match="*[local-name()='legal-statement']//*[local-name()='title']">

                <!-- process in the template 'title' -->
                <xsl:call-template name="title"/>

    </xsl:template> <!-- legal-statement/title -->

    <xsl:template match="*[local-name()='legal-statement']//*[local-name()='p']">
        <xsl:param name="margin"/>

                <!-- process in the template 'paragraph' -->
                <xsl:call-template name="paragraph">
                    <xsl:with-param name="margin" select="$margin"/>
                </xsl:call-template>

    </xsl:template> <!-- legal-statement/p -->

    <xsl:template match="*[local-name()='feedback-statement']">
        <fo:block xsl:use-attribute-sets="feedback-statement-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template> <!-- feedback-statement -->

    <xsl:template match="*[local-name()='feedback-statement']//*[local-name()='title']">

                <!-- process in the template 'title' -->
                <xsl:call-template name="title"/>

    </xsl:template>

    <xsl:template match="*[local-name()='feedback-statement']//*[local-name()='p']">
        <xsl:param name="margin"/>

                <!-- process in the template 'paragraph' -->
                <xsl:call-template name="paragraph">
                    <xsl:with-param name="margin" select="$margin"/>
                </xsl:call-template>

    </xsl:template>

    <!-- ================================= -->
    <!-- END Preface boilerplate sections processing -->
    <!-- ================================= -->

    <!-- add zero spaces into table cells text -->
    <xsl:template match="*[local-name()='td']//text() | *[local-name()='th']//text() | *[local-name()='dt']//text() | *[local-name()='dd']//text()" priority="1">
        <xsl:choose>
            <xsl:when test="parent::*[local-name() = 'keep-together_within-line']">
                <xsl:value-of select="."/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="addZeroWidthSpacesToTextNodes"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="addZeroWidthSpacesToTextNodes">
        <xsl:variable name="text"><text><xsl:call-template name="text"/></text></xsl:variable>
        <!-- <xsl:copy-of select="$text"/> -->
        <xsl:for-each select="xalan:nodeset($text)/text/node()">
            <xsl:choose>
                <xsl:when test="self::text()"><xsl:call-template name="add-zero-spaces-java"/></xsl:when>
                <xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise> <!-- copy 'as-is' for <fo:inline keep-together.within-line="always" ...  -->
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="*[local-name()='table']" name="table">

        <xsl:variable name="table-preamble">

        </xsl:variable>

        <xsl:variable name="table">

            <xsl:variable name="simple-table">
                <xsl:call-template name="getSimpleTable">
                    <xsl:with-param name="id" select="@id"/>
                </xsl:call-template>
            </xsl:variable>
            <!-- <xsl:variable name="simple-table" select="xalan:nodeset($simple-table_)"/> -->

            <!-- simple-table=<xsl:copy-of select="$simple-table"/> -->

            <!-- Display table's name before table as standalone block -->
            <!-- $namespace = 'iso' or  -->

                    <xsl:apply-templates select="*[local-name()='name']"/> <!-- table's title rendered before table -->

                    <xsl:call-template name="table_name_fn_display"/>

            <xsl:variable name="cols-count" select="count(xalan:nodeset($simple-table)/*/tr[1]/td)"/>

            <xsl:variable name="colwidths">
                <xsl:if test="not(*[local-name()='colgroup']/*[local-name()='col'])">
                    <xsl:call-template name="calculate-column-widths">
                        <xsl:with-param name="cols-count" select="$cols-count"/>
                        <xsl:with-param name="table" select="$simple-table"/>
                    </xsl:call-template>
                </xsl:if>
            </xsl:variable>
            <!-- <xsl:variable name="colwidths" select="xalan:nodeset($colwidths_)"/> -->

            <!-- DEBUG -->
            <xsl:if test="$table_if_debug = 'true'">
                <fo:block font-size="60%">
                    <xsl:apply-templates select="xalan:nodeset($colwidths)" mode="print_as_xml"/>
                </fo:block>
            </xsl:if>

            <!-- <xsl:copy-of select="$colwidths"/> -->

            <!-- <xsl:text disable-output-escaping="yes">&lt;!- -</xsl:text>
            DEBUG
            colwidths=<xsl:copy-of select="$colwidths"/>
        <xsl:text disable-output-escaping="yes">- -&gt;</xsl:text> -->

            <xsl:variable name="margin-side">
                <xsl:choose>
                    <xsl:when test="$isApplyAutolayoutAlgorithm = 'true'">0</xsl:when>
                    <xsl:when test="sum(xalan:nodeset($colwidths)//column) &gt; 75">15</xsl:when>
                    <xsl:otherwise>0</xsl:otherwise>
                </xsl:choose>
            </xsl:variable>

            <fo:block-container xsl:use-attribute-sets="table-container-style">

                    <xsl:attribute name="margin-left"><xsl:value-of select="-$margin-side"/>mm</xsl:attribute>
                    <xsl:attribute name="margin-right"><xsl:value-of select="-$margin-side"/>mm</xsl:attribute>

                <!-- end table block-container attributes -->

                <!-- display table's name before table for PAS inside block-container (2-columnn layout) -->

                <xsl:variable name="table_width_default">100%</xsl:variable>
                <xsl:variable name="table_width">
                    <!-- for centered table always 100% (@width will be set for middle/second cell of outer table) -->
                    <xsl:value-of select="$table_width_default"/>
                </xsl:variable>

                <xsl:variable name="table_attributes">

                    <xsl:element name="table_attributes" use-attribute-sets="table-style">
                        <xsl:attribute name="width"><xsl:value-of select="normalize-space($table_width)"/></xsl:attribute>

                            <xsl:attribute name="margin-left"><xsl:value-of select="$margin-side"/>mm</xsl:attribute>
                            <xsl:attribute name="margin-right"><xsl:value-of select="$margin-side"/>mm</xsl:attribute>

                    </xsl:element>
                </xsl:variable>

                <xsl:if test="$isGenerateTableIF = 'true'">
                    <!-- to determine start of table -->
                    <fo:block id="{concat('table_if_start_',@id)}" keep-with-next="always" font-size="1pt">Start table '<xsl:value-of select="@id"/>'.</fo:block>
                </xsl:if>

                <fo:table id="{@id}">

                    <xsl:if test="$isGenerateTableIF = 'true'">
                        <xsl:attribute name="wrap-option">no-wrap</xsl:attribute>
                    </xsl:if>

                    <xsl:for-each select="xalan:nodeset($table_attributes)/table_attributes/@*">
                        <xsl:attribute name="{local-name()}">
                            <xsl:value-of select="."/>
                        </xsl:attribute>
                    </xsl:for-each>

                    <xsl:variable name="isNoteOrFnExist" select="./*[local-name()='note'] or .//*[local-name()='fn'][local-name(..) != 'name']"/>
                    <xsl:if test="$isNoteOrFnExist = 'true'">
                        <xsl:attribute name="border-bottom">0pt solid black</xsl:attribute> <!-- set 0pt border, because there is a separete table below for footer  -->
                    </xsl:if>

                    <xsl:choose>
                        <xsl:when test="$isGenerateTableIF = 'true'">
                            <!-- generate IF for table widths -->
                            <!-- example:
                                <tr>
                                    <td valign="top" align="left" id="tab-symdu_1_1">
                                        <p>Symbol</p>
                                        <word id="tab-symdu_1_1_word_1">Symbol</word>
                                    </td>
                                    <td valign="top" align="left" id="tab-symdu_1_2">
                                        <p>Description</p>
                                        <word id="tab-symdu_1_2_word_1">Description</word>
                                    </td>
                                </tr>
                            -->
                            <!-- Simple_table=<xsl:copy-of select="$simple-table"/> -->
                            <xsl:apply-templates select="xalan:nodeset($simple-table)" mode="process_table-if"/>

                        </xsl:when>
                        <xsl:otherwise>

                            <xsl:choose>
                                <xsl:when test="*[local-name()='colgroup']/*[local-name()='col']">
                                    <xsl:for-each select="*[local-name()='colgroup']/*[local-name()='col']">
                                        <fo:table-column column-width="{@width}"/>
                                    </xsl:for-each>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:call-template name="insertTableColumnWidth">
                                        <xsl:with-param name="colwidths" select="$colwidths"/>
                                    </xsl:call-template>
                                </xsl:otherwise>
                            </xsl:choose>

                            <xsl:choose>
                                <xsl:when test="not(*[local-name()='tbody']) and *[local-name()='thead']">
                                    <xsl:apply-templates select="*[local-name()='thead']" mode="process_tbody"/>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:apply-templates select="node()[not(local-name() = 'name') and not(local-name() = 'note')          and not(local-name() = 'thead') and not(local-name() = 'tfoot')]"/> <!-- process all table' elements, except name, header, footer and note that renders separaterely -->
                                </xsl:otherwise>
                            </xsl:choose>

                        </xsl:otherwise>
                    </xsl:choose>

                </fo:table>

                <xsl:variable name="colgroup" select="*[local-name()='colgroup']"/>
                <xsl:for-each select="*[local-name()='tbody']"><!-- select context to tbody -->
                    <xsl:call-template name="insertTableFooterInSeparateTable">
                        <xsl:with-param name="table_attributes" select="$table_attributes"/>
                        <xsl:with-param name="colwidths" select="$colwidths"/>
                        <xsl:with-param name="colgroup" select="$colgroup"/>
                    </xsl:call-template>
                </xsl:for-each>

                    <xsl:apply-templates select="*[local-name()='note']"/>

                <xsl:if test="*[local-name()='bookmark']"> <!-- special case: table/bookmark -->
                    <fo:block keep-with-previous="always" line-height="0.1">
                        <xsl:for-each select="*[local-name()='bookmark']">
                            <xsl:call-template name="bookmark"/>
                        </xsl:for-each>
                    </fo:block>
                </xsl:if>

            </fo:block-container>
        </xsl:variable>

        <xsl:variable name="isAdded" select="@added"/>
        <xsl:variable name="isDeleted" select="@deleted"/>

        <xsl:choose>
            <xsl:when test="@width">

                <!-- centered table when table name is centered (see table-name-style) -->

                    <fo:table table-layout="fixed" width="100%">
                        <fo:table-column column-width="proportional-column-width(1)"/>
                        <fo:table-column column-width="{@width}"/>
                        <fo:table-column column-width="proportional-column-width(1)"/>
                        <fo:table-body>
                            <fo:table-row>
                                <fo:table-cell column-number="2">
                                    <xsl:copy-of select="$table-preamble"/>
                                    <fo:block>
                                        <xsl:call-template name="setTrackChangesStyles">
                                            <xsl:with-param name="isAdded" select="$isAdded"/>
                                            <xsl:with-param name="isDeleted" select="$isDeleted"/>
                                        </xsl:call-template>
                                        <xsl:copy-of select="$table"/>
                                    </fo:block>
                                </fo:table-cell>
                            </fo:table-row>
                        </fo:table-body>
                    </fo:table>

            </xsl:when>
            <xsl:otherwise>
                <xsl:choose>
                    <xsl:when test="$isAdded = 'true' or $isDeleted = 'true'">
                        <xsl:copy-of select="$table-preamble"/>
                        <fo:block>
                            <xsl:call-template name="setTrackChangesStyles">
                                <xsl:with-param name="isAdded" select="$isAdded"/>
                                <xsl:with-param name="isDeleted" select="$isDeleted"/>
                            </xsl:call-template>
                            <xsl:copy-of select="$table"/>
                        </fo:block>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:copy-of select="$table-preamble"/>
                        <xsl:copy-of select="$table"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>

    <xsl:template match="*[local-name()='table']/*[local-name() = 'name']">
        <xsl:param name="continued"/>
        <xsl:if test="normalize-space() != ''">

                    <fo:block xsl:use-attribute-sets="table-name-style">

                        <xsl:choose>
                            <xsl:when test="$continued = 'true'">

                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:apply-templates/>
                            </xsl:otherwise>
                        </xsl:choose>

                    </fo:block>

        </xsl:if>
    </xsl:template> <!-- table/name -->

    <xsl:template name="calculate-columns-numbers">
        <xsl:param name="table-row"/>
        <xsl:variable name="columns-count" select="count($table-row/*)"/>
        <xsl:variable name="sum-colspans" select="sum($table-row/*/@colspan)"/>
        <xsl:variable name="columns-with-colspan" select="count($table-row/*[@colspan])"/>
        <xsl:value-of select="$columns-count + $sum-colspans - $columns-with-colspan"/>
    </xsl:template>

    <xsl:template name="calculate-column-widths">
        <xsl:param name="table"/>
        <xsl:param name="cols-count"/>
        <xsl:choose>
            <xsl:when test="$isApplyAutolayoutAlgorithm = 'true'">
                <xsl:call-template name="get-calculated-column-widths-autolayout-algorithm"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="calculate-column-widths-proportional">
                    <xsl:with-param name="cols-count" select="$cols-count"/>
                    <xsl:with-param name="table" select="$table"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- ================================================== -->
    <!-- Calculate column's width based on text string max widths -->
    <!-- ================================================== -->
    <xsl:template name="calculate-column-widths-proportional">
        <xsl:param name="table"/>
        <xsl:param name="cols-count"/>
        <xsl:param name="curr-col" select="1"/>
        <xsl:param name="width" select="0"/>

        <!-- table=<xsl:copy-of select="$table"/> -->

        <xsl:if test="$curr-col &lt;= $cols-count">
            <xsl:variable name="widths">
                <xsl:choose>
                    <xsl:when test="not($table)"><!-- this branch is not using in production, for debug only -->
                        <xsl:for-each select="*[local-name()='thead']//*[local-name()='tr']">
                            <xsl:variable name="words">
                                <xsl:call-template name="tokenize">
                                    <xsl:with-param name="text" select="translate(*[local-name()='th'][$curr-col],'- —:', '    ')"/>
                                </xsl:call-template>
                            </xsl:variable>
                            <xsl:variable name="max_length">
                                <xsl:call-template name="max_length">
                                    <xsl:with-param name="words" select="xalan:nodeset($words)"/>
                                </xsl:call-template>
                            </xsl:variable>
                            <width>
                                <xsl:value-of select="$max_length"/>
                            </width>
                        </xsl:for-each>
                        <xsl:for-each select="*[local-name()='tbody']//*[local-name()='tr']">
                            <xsl:variable name="words">
                                <xsl:call-template name="tokenize">
                                    <xsl:with-param name="text" select="translate(*[local-name()='td'][$curr-col],'- —:', '    ')"/>
                                </xsl:call-template>
                            </xsl:variable>
                            <xsl:variable name="max_length">
                                <xsl:call-template name="max_length">
                                    <xsl:with-param name="words" select="xalan:nodeset($words)"/>
                                </xsl:call-template>
                            </xsl:variable>
                            <width>
                                <xsl:value-of select="$max_length"/>
                            </width>

                        </xsl:for-each>
                    </xsl:when>
                    <xsl:otherwise>
                        <!-- <curr_col><xsl:value-of select="$curr-col"/></curr_col> -->

                        <!-- <table><xsl:copy-of select="$table"/></table>
                         -->
                        <xsl:for-each select="xalan:nodeset($table)/*/*[local-name()='tr']">
                            <xsl:variable name="td_text">
                                <xsl:apply-templates select="td[$curr-col]" mode="td_text"/>
                            </xsl:variable>
                            <!-- <td_text><xsl:value-of select="$td_text"/></td_text> -->
                            <xsl:variable name="words">
                                <xsl:variable name="string_with_added_zerospaces">
                                    <xsl:call-template name="add-zero-spaces-java">
                                        <xsl:with-param name="text" select="$td_text"/>
                                    </xsl:call-template>
                                </xsl:variable>
                                <!-- <xsl:message>string_with_added_zerospaces=<xsl:value-of select="$string_with_added_zerospaces"/></xsl:message> -->
                                <xsl:call-template name="tokenize">
                                    <!-- <xsl:with-param name="text" select="translate(td[$curr-col],'- —:', '    ')"/> -->
                                    <!-- 2009 thinspace -->
                                    <!-- <xsl:with-param name="text" select="translate(normalize-space($td_text),'- —:', '    ')"/> -->
                                    <xsl:with-param name="text" select="normalize-space(translate($string_with_added_zerospaces, '​­', '  '))"/> <!-- replace zero-width-space and soft-hyphen to space -->
                                </xsl:call-template>
                            </xsl:variable>
                            <!-- words=<xsl:copy-of select="$words"/> -->
                            <xsl:variable name="max_length">
                                <xsl:call-template name="max_length">
                                    <xsl:with-param name="words" select="xalan:nodeset($words)"/>
                                </xsl:call-template>
                            </xsl:variable>
                            <!-- <xsl:message>max_length=<xsl:value-of select="$max_length"/></xsl:message> -->
                            <width>
                                <xsl:variable name="divider">
                                    <xsl:choose>
                                        <xsl:when test="td[$curr-col]/@divide">
                                            <xsl:value-of select="td[$curr-col]/@divide"/>
                                        </xsl:when>
                                        <xsl:otherwise>1</xsl:otherwise>
                                    </xsl:choose>
                                </xsl:variable>
                                <xsl:value-of select="$max_length div $divider"/>
                            </width>

                        </xsl:for-each>

                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>

            <!-- widths=<xsl:copy-of select="$widths"/> -->

            <column>
                <xsl:for-each select="xalan:nodeset($widths)//width">
                    <xsl:sort select="." data-type="number" order="descending"/>
                    <xsl:if test="position()=1">
                            <xsl:value-of select="."/>
                    </xsl:if>
                </xsl:for-each>
            </column>
            <xsl:call-template name="calculate-column-widths-proportional">
                <xsl:with-param name="cols-count" select="$cols-count"/>
                <xsl:with-param name="curr-col" select="$curr-col +1"/>
                <xsl:with-param name="table" select="$table"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template> <!-- calculate-column-widths-proportional -->

    <!-- ================================= -->
    <!-- mode="td_text" -->
    <!-- ================================= -->
    <!-- replace each each char to 'X', just to process the tag 'keep-together_within-line' as whole word in longest word calculation -->
    <xsl:template match="*[@keep-together.within-line or local-name() = 'keep-together_within-line']/text()" priority="2" mode="td_text">
        <!-- <xsl:message>DEBUG t1=<xsl:value-of select="."/></xsl:message>
        <xsl:message>DEBUG t2=<xsl:value-of select="java:replaceAll(java:java.lang.String.new(.),'.','X')"/></xsl:message> -->
        <xsl:value-of select="java:replaceAll(java:java.lang.String.new(.),'.','X')"/>

        <!-- if all capitals english letters or digits -->
        <xsl:if test="normalize-space(translate(., concat($upper,'0123456789'), '')) = ''">
            <xsl:call-template name="repeat">
                <xsl:with-param name="char" select="'X'"/>
                <xsl:with-param name="count" select="string-length(normalize-space(.)) * 0.5"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template match="text()" mode="td_text">
        <xsl:value-of select="translate(., $zero_width_space, ' ')"/><xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="*[local-name()='termsource']" mode="td_text">
        <xsl:value-of select="*[local-name()='origin']/@citeas"/>
    </xsl:template>

    <xsl:template match="*[local-name()='link']" mode="td_text">
        <xsl:value-of select="@target"/>
    </xsl:template>

    <xsl:template match="*[local-name()='math']" mode="td_text" name="math_length">
        <xsl:if test="$isGenerateTableIF = 'false'">
            <xsl:variable name="mathml_">
                <xsl:for-each select="*">
                    <xsl:if test="local-name() != 'unit' and local-name() != 'prefix' and local-name() != 'dimension' and local-name() != 'quantity'">
                        <xsl:copy-of select="."/>
                    </xsl:if>
                </xsl:for-each>
            </xsl:variable>
            <xsl:variable name="mathml" select="xalan:nodeset($mathml_)"/>

            <xsl:variable name="math_text">
                <xsl:value-of select="normalize-space($mathml)"/>
                <xsl:for-each select="$mathml//@open"><xsl:value-of select="."/></xsl:for-each>
                <xsl:for-each select="$mathml//@close"><xsl:value-of select="."/></xsl:for-each>
            </xsl:variable>
            <xsl:value-of select="translate($math_text, ' ', '#')"/><!-- mathml images as one 'word' without spaces -->
        </xsl:if>
    </xsl:template>
    <!-- ================================= -->
    <!-- END mode="td_text" -->
    <!-- ================================= -->
    <!-- ================================================== -->
    <!-- END Calculate column's width based on text string max widths -->
    <!-- ================================================== -->

    <!-- ================================================== -->
    <!-- Calculate column's width based on HTML4 algorithm -->
    <!-- (https://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.5.2) -->
    <!-- ================================================== -->

    <!-- INPUT: table with columns widths, generated by table_if.xsl  -->
    <xsl:template name="calculate-column-widths-autolayout-algorithm">
        <xsl:param name="parent_table_page-width"/> <!-- for nested tables, in re-calculate step -->

        <!-- via intermediate format -->

        <!-- The algorithm uses two passes through the table data and scales linearly with the size of the table -->

        <!-- In the first pass, line wrapping is disabled, and the user agent keeps track of the minimum and maximum width of each cell. -->

        <!-- Since line wrap has been disabled, paragraphs are treated as long lines unless broken by BR elements. -->

        <xsl:variable name="page_width">
            <xsl:choose>
                <xsl:when test="$parent_table_page-width != ''">
                    <xsl:value-of select="$parent_table_page-width"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="@page-width"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:if test="$table_if_debug = 'true'">
            <page_width><xsl:value-of select="$page_width"/></page_width>
        </xsl:if>

        <!-- There are three cases: -->
        <xsl:choose>
            <!-- 1. The minimum table width is equal to or wider than the available space -->
            <xsl:when test="@width_min &gt;= $page_width and 1 = 2"> <!-- this condition isn't working see case 3 below -->
                <!-- call old algorithm -->
                <case1/>
                <!-- <xsl:variable name="cols-count" select="count(xalan:nodeset($table)/*/tr[1]/td)"/>
                <xsl:call-template name="calculate-column-widths-proportional">
                    <xsl:with-param name="cols-count" select="$cols-count"/>
                    <xsl:with-param name="table" select="$table"/>
                </xsl:call-template> -->
            </xsl:when>
            <!-- 2. The maximum table width fits within the available space. In this case, set the columns to their maximum widths. -->
            <xsl:when test="@width_max &lt;= $page_width">
                <case2/>
                <autolayout/>
                <xsl:for-each select="column/@width_max">
                    <column divider="100"><xsl:value-of select="."/></column>
                </xsl:for-each>
            </xsl:when>
            <!-- 3. The maximum width of the table is greater than the available space, but the minimum table width is smaller. 
            In this case, find the difference between the available space and the minimum table width, lets call it W. 
            Lets also call D the difference between maximum and minimum width of the table. 
            For each column, let d be the difference between maximum and minimum width of that column. 
            Now set the column's width to the minimum width plus d times W over D. 
            This makes columns with large differences between minimum and maximum widths wider than columns with smaller differences. -->
            <xsl:when test="(@width_max &gt; $page_width and @width_min &lt; $page_width) or (@width_min &gt;= $page_width)">
                <!-- difference between the available space and the minimum table width -->
                <xsl:variable name="W" select="$page_width - @width_min"/>
                <W><xsl:value-of select="$W"/></W>
                <!-- difference between maximum and minimum width of the table -->
                <xsl:variable name="D" select="@width_max - @width_min"/>
                <D><xsl:value-of select="$D"/></D>
                <case3/>
                <autolayout/>
                <xsl:if test="@width_min &gt;= $page_width">
                    <split_keep-within-line>true</split_keep-within-line>
                </xsl:if>
                <xsl:for-each select="column">
                    <!-- difference between maximum and minimum width of that column.  -->
                    <xsl:variable name="d" select="@width_max - @width_min"/>
                    <d><xsl:value-of select="$d"/></d>
                    <width_min><xsl:value-of select="@width_min"/></width_min>
                    <e><xsl:value-of select="$d * $W div $D"/></e>
                    <!-- set the column's width to the minimum width plus d times W over D.  -->
                    <column divider="100">
                        <xsl:value-of select="round(@width_min + $d * $W div $D)"/> <!--  * 10 -->
                    </column>
                </xsl:for-each>

            </xsl:when>
            <xsl:otherwise><unknown_case/></xsl:otherwise>
        </xsl:choose>

    </xsl:template> <!-- calculate-column-widths-autolayout-algorithm -->

    <xsl:template name="get-calculated-column-widths-autolayout-algorithm">

        <!-- if nested 'dl' or 'table' -->
        <xsl:variable name="parent_table_id" select="normalize-space(ancestor::*[local-name() = 'table' or local-name() = 'dl'][1]/@id)"/>
        <parent_table_id><xsl:value-of select="$parent_table_id"/></parent_table_id>

        <parent_element><xsl:value-of select="local-name(..)"/></parent_element>

        <ancestor_tree>
            <xsl:for-each select="ancestor::*">
                <ancestor><xsl:value-of select="local-name()"/></ancestor>
            </xsl:for-each>
        </ancestor_tree>

        <xsl:variable name="parent_table_page-width_">
            <xsl:if test="$parent_table_id != ''">
                <!-- determine column number in the parent table -->
                <xsl:variable name="parent_table_column_number">
                    <xsl:choose>
                        <!-- <xsl:when test="parent::*[local-name() = 'dd']">2</xsl:when> -->
                        <xsl:when test="(ancestor::*[local-name() = 'dd' or local-name() = 'table' or local-name() = 'dl'])[last()][local-name() = 'dd' or local-name() = 'dl']">2</xsl:when>
                        <xsl:otherwise> <!-- parent is table -->
                            <xsl:value-of select="count(ancestor::*[local-name() = 'td'][1]/preceding-sibling::*[local-name() = 'td']) + 1"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <!-- find table by id in the file 'table_widths' and get all Nth `<column>...</column> -->

                <xsl:variable name="parent_table_column_" select="$table_widths_from_if_calculated//table[@id = $parent_table_id]/column[number($parent_table_column_number)]"/>
                <xsl:variable name="parent_table_column" select="xalan:nodeset($parent_table_column_)"/>
                <!-- <xsl:variable name="divider">
                    <xsl:value-of select="$parent_table_column/@divider"/>
                    <xsl:if test="not($parent_table_column/@divider)">1</xsl:if>
                </xsl:variable> -->
                <xsl:value-of select="$parent_table_column/text()"/> <!--  * 10 -->
            </xsl:if>
        </xsl:variable>
        <xsl:variable name="parent_table_page-width" select="normalize-space($parent_table_page-width_)"/>

        <parent_table_page-width><xsl:value-of select="$parent_table_page-width"/></parent_table_page-width>

        <!-- get current table id -->
        <xsl:variable name="table_id" select="@id"/>

        <xsl:choose>
            <xsl:when test="$parent_table_id = '' or $parent_table_page-width = ''">
                <!-- find table by id in the file 'table_widths' and get all `<column>...</column> -->
                <xsl:copy-of select="$table_widths_from_if_calculated//table[@id = $table_id]/node()"/>
            </xsl:when>
            <xsl:otherwise>
                <!-- recalculate columns width based on parent table width -->
                <xsl:for-each select="$table_widths_from_if//table[@id = $table_id]">
                    <xsl:call-template name="calculate-column-widths-autolayout-algorithm">
                        <xsl:with-param name="parent_table_page-width" select="$parent_table_page-width"/> <!-- padding-left = 2mm  = 50000-->
                    </xsl:call-template>
                </xsl:for-each>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template> <!-- get-calculated-column-widths-autolayout-algorithm -->

    <!-- ================================================== -->
    <!-- Calculate column's width based on HTML4 algorithm -->
    <!-- ================================================== -->

    <xsl:template match="*[local-name()='thead']">
        <xsl:param name="cols-count"/>
        <fo:table-header>

            <xsl:apply-templates/>
        </fo:table-header>
    </xsl:template> <!-- thead -->

    <!-- template is using for iso, jcgm, bsi only -->
    <xsl:template name="table-header-title">
        <xsl:param name="cols-count"/>
        <!-- row for title -->
        <fo:table-row>
            <fo:table-cell number-columns-spanned="{$cols-count}" border-left="1.5pt solid white" border-right="1.5pt solid white" border-top="1.5pt solid white" border-bottom="1.5pt solid black">

                        <xsl:apply-templates select="ancestor::*[local-name()='table']/*[local-name()='name']">
                            <xsl:with-param name="continued">true</xsl:with-param>
                        </xsl:apply-templates>

            </fo:table-cell>
        </fo:table-row>
    </xsl:template> <!-- table-header-title -->

    <xsl:template match="*[local-name()='thead']" mode="process_tbody">
        <fo:table-body>
            <xsl:apply-templates/>
        </fo:table-body>
    </xsl:template>

    <xsl:template match="*[local-name()='tfoot']">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template name="insertTableFooter">
        <xsl:param name="cols-count"/>
        <xsl:if test="../*[local-name()='tfoot']">
            <fo:table-footer>
                <xsl:apply-templates select="../*[local-name()='tfoot']"/>
            </fo:table-footer>
        </xsl:if>
    </xsl:template>

    <xsl:template name="insertTableFooterInSeparateTable">
        <xsl:param name="table_attributes"/>
        <xsl:param name="colwidths"/>
        <xsl:param name="colgroup"/>

        <xsl:variable name="isNoteOrFnExist" select="../*[local-name()='note'] or ..//*[local-name()='fn'][local-name(..) != 'name']"/>

        <xsl:variable name="isNoteOrFnExistShowAfterTable">

        </xsl:variable>

        <xsl:if test="$isNoteOrFnExist = 'true' or normalize-space($isNoteOrFnExistShowAfterTable) = 'true'">

            <xsl:variable name="cols-count">
                <xsl:choose>
                    <xsl:when test="xalan:nodeset($colgroup)//*[local-name()='col']">
                        <xsl:value-of select="count(xalan:nodeset($colgroup)//*[local-name()='col'])"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="count(xalan:nodeset($colwidths)//column)"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>

            <xsl:variable name="tableWithNotesAndFootnotes">

                <fo:table keep-with-previous="always">
                    <xsl:for-each select="xalan:nodeset($table_attributes)/table_attributes/@*">
                        <xsl:variable name="name" select="local-name()"/>
                        <xsl:choose>
                            <xsl:when test="$name = 'border-top'">
                                <xsl:attribute name="{$name}">0pt solid black</xsl:attribute>
                            </xsl:when>
                            <xsl:when test="$name = 'border'">
                                <xsl:attribute name="{$name}"><xsl:value-of select="."/></xsl:attribute>
                                <xsl:attribute name="border-top">0pt solid black</xsl:attribute>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:attribute name="{$name}"><xsl:value-of select="."/></xsl:attribute>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:for-each>

                    <xsl:choose>
                        <xsl:when test="xalan:nodeset($colgroup)//*[local-name()='col']">
                            <xsl:for-each select="xalan:nodeset($colgroup)//*[local-name()='col']">
                                <fo:table-column column-width="{@width}"/>
                            </xsl:for-each>
                        </xsl:when>
                        <xsl:otherwise>
                            <!-- $colwidths=<xsl:copy-of select="$colwidths"/> -->
                            <xsl:call-template name="insertTableColumnWidth">
                                <xsl:with-param name="colwidths" select="$colwidths"/>
                            </xsl:call-template>
                        </xsl:otherwise>
                    </xsl:choose>

                    <fo:table-body>
                        <fo:table-row>
                            <fo:table-cell xsl:use-attribute-sets="table-footer-cell-style" number-columns-spanned="{$cols-count}">

                                <!-- fn will be processed inside 'note' processing -->

                                <!-- for BSI (not PAS) display Notes before footnotes -->

                                <!-- except gb and bsi  -->

                                <!-- horizontal row separator -->

                                <!-- fn processing -->

                                        <xsl:call-template name="table_fn_display"/>

                                <!-- for PAS display Notes after footnotes -->

                            </fo:table-cell>
                        </fo:table-row>
                    </fo:table-body>

                </fo:table>
            </xsl:variable>

            <xsl:if test="normalize-space($tableWithNotesAndFootnotes) != ''">
                <xsl:copy-of select="$tableWithNotesAndFootnotes"/>
            </xsl:if>

        </xsl:if>
    </xsl:template> <!-- insertTableFooterInSeparateTable -->

    <xsl:template match="*[local-name()='tbody']">

        <xsl:variable name="cols-count">
            <xsl:choose>
                <xsl:when test="../*[local-name()='thead']">
                    <xsl:call-template name="calculate-columns-numbers">
                        <xsl:with-param name="table-row" select="../*[local-name()='thead']/*[local-name()='tr'][1]"/>
                    </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:call-template name="calculate-columns-numbers">
                        <xsl:with-param name="table-row" select="./*[local-name()='tr'][1]"/>
                    </xsl:call-template>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:apply-templates select="../*[local-name()='thead']">
            <xsl:with-param name="cols-count" select="$cols-count"/>
        </xsl:apply-templates>

        <xsl:call-template name="insertTableFooter">
            <xsl:with-param name="cols-count" select="$cols-count"/>
        </xsl:call-template>

        <fo:table-body>

            <xsl:apply-templates/>

        </fo:table-body>

    </xsl:template> <!-- tbody -->

    <xsl:template match="/" mode="process_table-if">
        <xsl:param name="table_or_dl">table</xsl:param>
        <xsl:apply-templates mode="process_table-if">
            <xsl:with-param name="table_or_dl" select="$table_or_dl"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="*[local-name()='tbody']" mode="process_table-if">
        <xsl:param name="table_or_dl">table</xsl:param>

        <fo:table-body>
            <xsl:for-each select="*[local-name() = 'tr']">
                <xsl:variable name="col_count" select="count(*)"/>

                <!-- iteration for each tr/td -->

                <xsl:choose>
                    <xsl:when test="$table_or_dl = 'table'">
                        <xsl:for-each select="*[local-name() = 'td' or local-name() = 'th']/*">
                            <fo:table-row number-columns-spanned="{$col_count}">
                                <xsl:copy-of select="../@font-weight"/>
                                <!-- <test_table><xsl:copy-of select="."/></test_table> -->
                                <xsl:call-template name="td"/>
                            </fo:table-row>
                        </xsl:for-each>
                    </xsl:when>
                    <xsl:otherwise> <!-- $table_or_dl = 'dl' -->
                        <xsl:for-each select="*[local-name() = 'td' or local-name() = 'th']">
                            <xsl:variable name="is_dt" select="position() = 1"/>

                            <xsl:for-each select="*">
                                <!-- <test><xsl:copy-of select="."/></test> -->
                                <fo:table-row number-columns-spanned="{$col_count}">
                                    <xsl:choose>
                                        <xsl:when test="$is_dt">
                                            <xsl:call-template name="insert_dt_cell"/>
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:call-template name="insert_dd_cell"/>
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </fo:table-row>
                            </xsl:for-each>
                        </xsl:for-each>
                    </xsl:otherwise>
                </xsl:choose>

            </xsl:for-each>
        </fo:table-body>
    </xsl:template> <!-- process_table-if -->

    <!-- ===================== -->
    <!-- Table's row processing -->
    <!-- ===================== -->
    <!-- row in table header (thead) -->
    <xsl:template match="*[local-name()='thead']/*[local-name()='tr']" priority="2">
        <fo:table-row xsl:use-attribute-sets="table-header-row-style">

            <xsl:call-template name="setTableRowAttributes"/>

            <xsl:apply-templates/>
        </fo:table-row>
    </xsl:template>

    <!-- row in table footer (tfoot) -->
    <xsl:template match="*[local-name()='tfoot']/*[local-name()='tr']" priority="2">
        <fo:table-row xsl:use-attribute-sets="table-footer-row-style">

            <xsl:call-template name="setTableRowAttributes"/>
            <xsl:apply-templates/>
        </fo:table-row>
    </xsl:template>

    <!-- row in table's body (tbody) -->
    <xsl:template match="*[local-name()='tr']">
        <fo:table-row xsl:use-attribute-sets="table-body-row-style">

            <xsl:call-template name="setTableRowAttributes"/>
            <xsl:apply-templates/>
        </fo:table-row>
    </xsl:template>

    <xsl:template name="setTableRowAttributes">

    </xsl:template> <!-- setTableRowAttributes -->
    <!-- ===================== -->
    <!-- END Table's row processing -->
    <!-- ===================== -->

    <!-- cell in table header row -->
    <xsl:template match="*[local-name()='th']">
        <fo:table-cell xsl:use-attribute-sets="table-header-cell-style"> <!-- text-align="{@align}" -->
            <xsl:call-template name="setTextAlignment">
                <xsl:with-param name="default">center</xsl:with-param>
            </xsl:call-template>

            <xsl:if test="$lang = 'ar'">
                <xsl:attribute name="padding-right">1mm</xsl:attribute>
            </xsl:if>

            <xsl:call-template name="setTableCellAttributes"/>

            <fo:block>
                <xsl:apply-templates/>
            </fo:block>
        </fo:table-cell>
    </xsl:template> <!-- cell in table header row - 'th' -->

    <xsl:template name="setTableCellAttributes">
        <xsl:if test="@colspan">
            <xsl:attribute name="number-columns-spanned">
                <xsl:value-of select="@colspan"/>
            </xsl:attribute>
        </xsl:if>
        <xsl:if test="@rowspan">
            <xsl:attribute name="number-rows-spanned">
                <xsl:value-of select="@rowspan"/>
            </xsl:attribute>
        </xsl:if>
        <xsl:call-template name="display-align"/>
    </xsl:template>

    <xsl:template name="display-align">
        <xsl:if test="@valign">
            <xsl:attribute name="display-align">
                <xsl:choose>
                    <xsl:when test="@valign = 'top'">before</xsl:when>
                    <xsl:when test="@valign = 'middle'">center</xsl:when>
                    <xsl:when test="@valign = 'bottom'">after</xsl:when>
                    <xsl:otherwise>before</xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
        </xsl:if>
    </xsl:template>

    <!-- cell in table body, footer -->
    <xsl:template match="*[local-name()='td']" name="td">
        <fo:table-cell xsl:use-attribute-sets="table-cell-style"> <!-- text-align="{@align}" -->
            <xsl:call-template name="setTextAlignment">
                <xsl:with-param name="default">left</xsl:with-param>
            </xsl:call-template>

            <xsl:if test="$lang = 'ar'">
                <xsl:attribute name="padding-right">1mm</xsl:attribute>
            </xsl:if>

             <!-- bsi -->

                <xsl:if test="ancestor::*[local-name() = 'tfoot']">
                    <xsl:attribute name="border-bottom">solid black 0</xsl:attribute>
                </xsl:if>

            <xsl:if test=".//*[local-name() = 'table']"> <!-- if there is nested table -->
                <xsl:attribute name="padding-right">1mm</xsl:attribute>
            </xsl:if>

            <xsl:call-template name="setTableCellAttributes"/>

            <xsl:if test="$isGenerateTableIF = 'true'">
                <xsl:attribute name="border">1pt solid black</xsl:attribute> <!-- border is mandatory, to determine page width -->
                <xsl:attribute name="text-align">left</xsl:attribute>
            </xsl:if>

            <fo:block>

                <xsl:if test="$isGenerateTableIF = 'true'">
                    <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
                </xsl:if>

                <xsl:apply-templates/>

                <xsl:if test="$isGenerateTableIF = 'true'"> <fo:inline id="{@id}_end">end</fo:inline></xsl:if> <!-- to determine width of text --> <!-- <xsl:value-of select="$hair_space"/> -->

            </fo:block>
        </fo:table-cell>
    </xsl:template> <!-- td -->

    <xsl:template match="*[local-name()='table']/*[local-name()='note']" priority="2">

        <fo:block xsl:use-attribute-sets="table-note-style">

            <!-- Table's note name (NOTE, for example) -->
            <fo:inline xsl:use-attribute-sets="table-note-name-style">

                <xsl:apply-templates select="*[local-name() = 'name']"/>

            </fo:inline>

            <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
        </fo:block>

    </xsl:template> <!-- table/note -->

    <xsl:template match="*[local-name()='table']/*[local-name()='note']/*[local-name()='p']" priority="2">
        <xsl:apply-templates/>
    </xsl:template>

    <!-- ===================== -->
    <!-- Footnotes processing  -->
    <!-- ===================== -->
    <!--
    <fn reference="1">
            <p id="_8e5cf917-f75a-4a49-b0aa-1714cb6cf954">Formerly denoted as 15 % (m/m).</p>
        </fn>
    -->
    <!-- footnotes in text (title, bibliography, main body, table's, figure's names), not for tables, figures -->
    <xsl:template match="*[local-name() = 'fn'][not(ancestor::*[(local-name() = 'table' or local-name() = 'figure') and not(ancestor::*[local-name() = 'name'])])]" priority="2" name="fn">

        <!-- list of footnotes to calculate actual footnotes number -->
        <xsl:variable name="p_fn_">
            <xsl:call-template name="get_fn_list"/>
        </xsl:variable>
        <xsl:variable name="p_fn" select="xalan:nodeset($p_fn_)"/>

        <xsl:variable name="gen_id" select="generate-id(.)"/>
        <xsl:variable name="lang" select="ancestor::*[contains(local-name(), '-standard')]/*[local-name()='bibdata']//*[local-name()='language'][@current = 'true']"/>
        <xsl:variable name="reference_">
            <xsl:value-of select="@reference"/>
            <xsl:if test="normalize-space(@reference) = ''"><xsl:value-of select="$gen_id"/></xsl:if>
        </xsl:variable>
        <xsl:variable name="reference" select="normalize-space($reference_)"/>
        <!-- fn sequence number in document -->
        <xsl:variable name="current_fn_number">
            <xsl:choose>
                <xsl:when test="@current_fn_number"><xsl:value-of select="@current_fn_number"/></xsl:when> <!-- for BSI -->
                <xsl:otherwise>
                    <xsl:value-of select="count($p_fn//fn[@reference = $reference]/preceding-sibling::fn) + 1"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="current_fn_number_text">
            <xsl:value-of select="$current_fn_number"/>

        </xsl:variable>

        <xsl:variable name="ref_id" select="concat('footnote_', $lang, '_', $reference, '_', $current_fn_number)"/>
        <xsl:variable name="footnote_inline">
            <fo:inline xsl:use-attribute-sets="fn-num-style">

                <fo:basic-link internal-destination="{$ref_id}" fox:alt-text="footnote {$current_fn_number}">
                    <xsl:value-of select="$current_fn_number_text"/>
                </fo:basic-link>
            </fo:inline>
        </xsl:variable>
        <!-- DEBUG: p_fn=<xsl:copy-of select="$p_fn"/>
        gen_id=<xsl:value-of select="$gen_id"/> -->
        <xsl:choose>
            <xsl:when test="normalize-space(@skip_footnote_body) = 'true'">
                <xsl:copy-of select="$footnote_inline"/>
            </xsl:when>
            <xsl:when test="$p_fn//fn[@gen_id = $gen_id] or normalize-space(@skip_footnote_body) = 'false'">
                <fo:footnote xsl:use-attribute-sets="fn-style">
                    <xsl:copy-of select="$footnote_inline"/>
                    <fo:footnote-body>

                        <fo:block-container xsl:use-attribute-sets="fn-container-body-style">

                            <fo:block xsl:use-attribute-sets="fn-body-style">

                                <fo:inline id="{$ref_id}" xsl:use-attribute-sets="fn-body-num-style">

                                    <xsl:value-of select="$current_fn_number_text"/>
                                </fo:inline>
                                <xsl:apply-templates/>
                            </fo:block>
                        </fo:block-container>
                    </fo:footnote-body>
                </fo:footnote>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="$footnote_inline"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- fn in text -->

    <xsl:template name="get_fn_list">
        <xsl:choose>
            <xsl:when test="@current_fn_number"> <!-- for BSI, footnote reference number calculated already -->
                <fn gen_id="{generate-id(.)}">
                    <xsl:copy-of select="@*"/>
                    <xsl:copy-of select="node()"/>
                </fn>
            </xsl:when>
            <xsl:otherwise>
                <!-- itetation for:
                footnotes in bibdata/title
                footnotes in bibliography
                footnotes in document's body (except table's head/body/foot and figure text) 
                -->
                <xsl:for-each select="ancestor::*[contains(local-name(), '-standard')]/*[local-name() = 'bibdata']/*[local-name() = 'note'][@type='title-footnote']">
                    <fn gen_id="{generate-id(.)}">
                        <xsl:copy-of select="@*"/>
                        <xsl:copy-of select="node()"/>
                    </fn>
                </xsl:for-each>
                <xsl:for-each select="ancestor::*[contains(local-name(), '-standard')]/*[local-name()='boilerplate']/* |       ancestor::*[contains(local-name(), '-standard')]/*[local-name()='preface']/* |      ancestor::*[contains(local-name(), '-standard')]/*[local-name()='sections']/* |       ancestor::*[contains(local-name(), '-standard')]/*[local-name()='annex'] |      ancestor::*[contains(local-name(), '-standard')]/*[local-name()='bibliography']/*">
                    <xsl:sort select="@displayorder" data-type="number"/>
                    <xsl:for-each select=".//*[local-name() = 'bibitem'][ancestor::*[local-name() = 'references']]/*[local-name() = 'note'] |      .//*[local-name() = 'fn'][not(ancestor::*[(local-name() = 'table' or local-name() = 'figure') and not(ancestor::*[local-name() = 'name'])])][generate-id(.)=generate-id(key('kfn',@reference)[1])]">
                        <!-- copy unique fn -->
                        <fn gen_id="{generate-id(.)}">
                            <xsl:copy-of select="@*"/>
                            <xsl:copy-of select="node()"/>
                        </fn>
                    </xsl:for-each>
                </xsl:for-each>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- ============================ -->
    <!-- table's footnotes rendering -->
    <!-- ============================ -->
    <xsl:template name="table_fn_display">
        <xsl:variable name="references">

            <xsl:for-each select="..//*[local-name()='fn'][local-name(..) != 'name']">
                <xsl:call-template name="create_fn"/>
            </xsl:for-each>
        </xsl:variable>

        <xsl:for-each select="xalan:nodeset($references)//fn">
            <xsl:variable name="reference" select="@reference"/>
            <xsl:if test="not(preceding-sibling::*[@reference = $reference])"> <!-- only unique reference puts in note-->
                <fo:block xsl:use-attribute-sets="table-fn-style">

                    <fo:inline id="{@id}" xsl:use-attribute-sets="table-fn-number-style">

                        <xsl:value-of select="@reference"/>

                    </fo:inline>
                    <fo:inline xsl:use-attribute-sets="table-fn-body-style">
                        <xsl:copy-of select="./node()"/>
                    </fo:inline>
                </fo:block>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="create_fn">
        <fn reference="{@reference}" id="{@reference}_{ancestor::*[@id][1]/@id}">

            <xsl:apply-templates/>
        </fn>
    </xsl:template>

    <!-- footnotes for table's name rendering -->
    <xsl:template name="table_name_fn_display">
        <xsl:for-each select="*[local-name()='name']//*[local-name()='fn']">
            <xsl:variable name="reference" select="@reference"/>
            <fo:block id="{@reference}_{ancestor::*[@id][1]/@id}"><xsl:value-of select="@reference"/></fo:block>
            <fo:block margin-bottom="12pt">
                <xsl:apply-templates/>
            </fo:block>
        </xsl:for-each>
    </xsl:template>
    <!-- ============================ -->
    <!-- EMD table's footnotes rendering -->
    <!-- ============================ -->

    <!-- figure's footnotes rendering -->
    <xsl:template name="fn_display_figure">

        <xsl:variable name="references">
            <xsl:for-each select=".//*[local-name()='fn'][not(parent::*[local-name()='name'])]">
                <fn reference="{@reference}" id="{@reference}_{ancestor::*[@id][1]/@id}">
                    <xsl:apply-templates/>
                </fn>
            </xsl:for-each>
        </xsl:variable>

        <xsl:if test="xalan:nodeset($references)//fn">

            <xsl:variable name="key_iso">
                true
            </xsl:variable>

            <!-- current hierarchy is 'figure' element -->
            <xsl:variable name="following_dl_colwidths">
                <xsl:if test="*[local-name() = 'dl']"><!-- if there is a 'dl', then set the same columns width as for 'dl' -->
                    <xsl:variable name="simple-table">
                        <!-- <xsl:variable name="doc_ns">
                            <xsl:if test="$namespace = 'bipm'">bipm</xsl:if>
                        </xsl:variable>
                        <xsl:variable name="ns">
                            <xsl:choose>
                                <xsl:when test="normalize-space($doc_ns)  != ''">
                                    <xsl:value-of select="normalize-space($doc_ns)"/>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="substring-before(name(/*), '-')"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:variable> -->

                        <xsl:for-each select="*[local-name() = 'dl'][1]">
                            <tbody>
                                <xsl:apply-templates mode="dl"/>
                            </tbody>
                        </xsl:for-each>
                    </xsl:variable>

                    <xsl:call-template name="calculate-column-widths">
                        <xsl:with-param name="cols-count" select="2"/>
                        <xsl:with-param name="table" select="$simple-table"/>
                    </xsl:call-template>

                </xsl:if>
            </xsl:variable>

            <xsl:variable name="maxlength_dt">
                <xsl:for-each select="*[local-name() = 'dl'][1]">
                    <xsl:call-template name="getMaxLength_dt"/>
                </xsl:for-each>
            </xsl:variable>

            <fo:block>
                <fo:table width="95%" table-layout="fixed">
                    <xsl:if test="normalize-space($key_iso) = 'true'">
                        <xsl:attribute name="font-size">10pt</xsl:attribute>

                    </xsl:if>
                    <xsl:choose>
                        <!-- if there 'dl', then set same columns width -->
                        <xsl:when test="xalan:nodeset($following_dl_colwidths)//column">
                            <xsl:call-template name="setColumnWidth_dl">
                                <xsl:with-param name="colwidths" select="$following_dl_colwidths"/>
                                <xsl:with-param name="maxlength_dt" select="$maxlength_dt"/>
                            </xsl:call-template>
                        </xsl:when>
                        <xsl:otherwise>
                            <fo:table-column column-width="15%"/>
                            <fo:table-column column-width="85%"/>
                        </xsl:otherwise>
                    </xsl:choose>
                    <fo:table-body>
                        <xsl:for-each select="xalan:nodeset($references)//fn">
                            <xsl:variable name="reference" select="@reference"/>
                            <xsl:if test="not(preceding-sibling::*[@reference = $reference])"> <!-- only unique reference puts in note-->
                                <fo:table-row>
                                    <fo:table-cell>
                                        <fo:block>
                                            <fo:inline id="{@id}" xsl:use-attribute-sets="figure-fn-number-style">
                                                <xsl:value-of select="@reference"/>
                                            </fo:inline>
                                        </fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell>
                                        <fo:block xsl:use-attribute-sets="figure-fn-body-style">
                                            <xsl:if test="normalize-space($key_iso) = 'true'">

                                                        <xsl:attribute name="margin-bottom">0</xsl:attribute>

                                            </xsl:if>
                                            <xsl:copy-of select="./node()"/>
                                        </fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                            </xsl:if>
                        </xsl:for-each>
                    </fo:table-body>
                </fo:table>
            </fo:block>
        </xsl:if>

    </xsl:template> <!-- fn_display_figure -->

    <!-- fn reference in the text rendering (for instance, 'some text 1) some text' ) -->
    <xsl:template match="*[local-name()='fn']">
        <fo:inline xsl:use-attribute-sets="fn-reference-style">

            <fo:basic-link internal-destination="{@reference}_{ancestor::*[@id][1]/@id}" fox:alt-text="{@reference}"> <!-- @reference   | ancestor::*[local-name()='clause'][1]/@id-->

                <xsl:value-of select="@reference"/>

            </fo:basic-link>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name()='fn']/text()[normalize-space() != '']">
        <fo:inline><xsl:value-of select="."/></fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name()='fn']//*[local-name()='p']">
        <fo:inline>
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>
    <!-- ===================== -->
    <!-- END Footnotes processing  -->
    <!-- ===================== -->

    <!-- ===================== -->
    <!-- Definition List -->
    <!-- ===================== -->
    <xsl:template match="*[local-name()='dl']">
        <xsl:variable name="isAdded" select="@added"/>
        <xsl:variable name="isDeleted" select="@deleted"/>
        <!-- <dl><xsl:copy-of select="."/></dl> -->
        <fo:block-container>

                    <xsl:if test="not(ancestor::*[local-name() = 'quote'])">
                        <xsl:attribute name="margin-left">0mm</xsl:attribute>
                    </xsl:if>

            <xsl:if test="parent::*[local-name() = 'note']">
                <xsl:attribute name="margin-left">
                    <xsl:choose>
                        <xsl:when test="not(ancestor::*[local-name() = 'table'])"><xsl:value-of select="$note-body-indent"/></xsl:when>
                        <xsl:otherwise><xsl:value-of select="$note-body-indent-table"/></xsl:otherwise>
                    </xsl:choose>
                </xsl:attribute>

                    <xsl:attribute name="margin-left">0mm</xsl:attribute>

            </xsl:if>

            <xsl:call-template name="setTrackChangesStyles">
                <xsl:with-param name="isAdded" select="$isAdded"/>
                <xsl:with-param name="isDeleted" select="$isDeleted"/>
            </xsl:call-template>

            <fo:block-container margin-left="0mm">

                        <xsl:attribute name="margin-right">0mm</xsl:attribute>

                <xsl:variable name="parent" select="local-name(..)"/>

                <xsl:variable name="key_iso">

                        <xsl:if test="$parent = 'figure' or $parent = 'formula'">true</xsl:if>
                     <!-- and  (not(../@class) or ../@class !='pseudocode') -->
                </xsl:variable>

                <xsl:variable name="onlyOneComponent" select="normalize-space($parent = 'formula' and count(*[local-name()='dt']) = 1)"/>

                <xsl:choose>
                    <xsl:when test="$onlyOneComponent = 'true'"> <!-- only one component -->

                                <fo:block text-align="left">

                                        <xsl:attribute name="margin-left">7.4mm</xsl:attribute>

                                    <xsl:variable name="title-where">
                                        <xsl:call-template name="getLocalizedString">
                                            <xsl:with-param name="key">where</xsl:with-param>
                                        </xsl:call-template>
                                    </xsl:variable>
                                    <xsl:value-of select="$title-where"/>
                                </fo:block>
                                <fo:block>

                                        <xsl:attribute name="text-indent">7.4mm</xsl:attribute>

                                    <xsl:apply-templates select="*[local-name()='dt']/*"/>
                                    —
                                    <xsl:text> </xsl:text>
                                    <xsl:apply-templates select="*[local-name()='dd']/*" mode="inline"/>
                                </fo:block>

                    </xsl:when> <!-- END: only one component -->
                    <xsl:when test="$parent = 'formula'"> <!-- a few components -->
                        <fo:block margin-bottom="12pt" text-align="left">

                                <xsl:attribute name="margin-left">7.4mm</xsl:attribute>
                                <xsl:attribute name="margin-bottom">0pt</xsl:attribute>

                            <xsl:variable name="title-where">
                                <xsl:call-template name="getLocalizedString">
                                    <xsl:with-param name="key">where</xsl:with-param>
                                </xsl:call-template>
                            </xsl:variable>
                            <xsl:value-of select="$title-where"/>
                        </fo:block>
                    </xsl:when>  <!-- END: a few components -->
                    <xsl:when test="$parent = 'figure' and  (not(../@class) or ../@class !='pseudocode')"> <!-- definition list in a figure -->
                        <fo:block font-weight="bold" text-align="left" margin-bottom="12pt" keep-with-next="always">

                                <xsl:attribute name="margin-bottom">0pt</xsl:attribute>
                                <xsl:attribute name="text-indent">7.4mm</xsl:attribute>

                            <xsl:variable name="title-key">
                                <xsl:call-template name="getLocalizedString">
                                    <xsl:with-param name="key">key</xsl:with-param>
                                </xsl:call-template>
                            </xsl:variable>
                            <xsl:value-of select="$title-key"/>
                        </fo:block>
                    </xsl:when>  <!-- END: definition list in a figure -->
                </xsl:choose>

                <!-- a few components -->
                <xsl:if test="$onlyOneComponent = 'false'">
                    <fo:block>

                        <xsl:if test="ancestor::*[local-name() = 'dd' or local-name() = 'td']">
                            <xsl:attribute name="margin-top">0</xsl:attribute>
                        </xsl:if>

                        <fo:block>

                                <xsl:attribute name="margin-left">7.4mm</xsl:attribute>
                                <xsl:if test="$parent = 'figure' and  (not(../@class) or ../@class !='pseudocode')">
                                    <xsl:attribute name="margin-left">15mm</xsl:attribute>
                                </xsl:if>

                            <xsl:apply-templates select="*[local-name() = 'name']">
                                <xsl:with-param name="process">true</xsl:with-param>
                            </xsl:apply-templates>

                            <xsl:if test="$isGenerateTableIF = 'true'">
                                <!-- to determine start of table -->
                                <fo:block id="{concat('table_if_start_',@id)}" keep-with-next="always" font-size="1pt">Start table '<xsl:value-of select="@id"/>'.</fo:block>
                            </xsl:if>

                            <fo:table width="95%" table-layout="fixed">

                                <xsl:if test="$isGenerateTableIF = 'true'">
                                    <xsl:attribute name="wrap-option">no-wrap</xsl:attribute>
                                </xsl:if>

                                    <xsl:attribute name="margin-left">-3.7mm</xsl:attribute>

                                <xsl:choose>
                                    <xsl:when test="normalize-space($key_iso) = 'true' and $parent = 'formula'"/>
                                    <xsl:when test="normalize-space($key_iso) = 'true'">
                                        <xsl:attribute name="font-size">10pt</xsl:attribute>

                                    </xsl:when>
                                </xsl:choose>

                                <xsl:choose>
                                    <xsl:when test="$isGenerateTableIF = 'true'">
                                        <!-- generate IF for table widths -->
                                        <!-- example:
                                            <tr>
                                                <td valign="top" align="left" id="tab-symdu_1_1">
                                                    <p>Symbol</p>
                                                    <word id="tab-symdu_1_1_word_1">Symbol</word>
                                                </td>
                                                <td valign="top" align="left" id="tab-symdu_1_2">
                                                    <p>Description</p>
                                                    <word id="tab-symdu_1_2_word_1">Description</word>
                                                </td>
                                            </tr>
                                        -->

                                        <!-- create virtual html table for dl/[dt and dd] -->
                                        <xsl:variable name="simple-table">

                                            <xsl:variable name="dl_table">
                                                <tbody>
                                                    <xsl:apply-templates mode="dl_if">
                                                        <xsl:with-param name="id" select="@id"/>
                                                    </xsl:apply-templates>
                                                </tbody>
                                            </xsl:variable>

                                            <!-- dl_table='<xsl:copy-of select="$dl_table"/>' -->

                                            <!-- Step: replace <br/> to <p>...</p> -->
                                            <xsl:variable name="table_without_br">
                                                <xsl:apply-templates select="xalan:nodeset($dl_table)" mode="table-without-br"/>
                                            </xsl:variable>

                                            <!-- table_without_br='<xsl:copy-of select="$table_without_br"/>' -->

                                            <!-- Step: add id to each cell -->
                                            <!-- add <word>...</word> for each word, image, math -->
                                            <xsl:variable name="simple-table-id">
                                                <xsl:apply-templates select="xalan:nodeset($table_without_br)" mode="simple-table-id">
                                                    <xsl:with-param name="id" select="@id"/>
                                                </xsl:apply-templates>
                                            </xsl:variable>

                                            <!-- simple-table-id='<xsl:copy-of select="$simple-table-id"/>' -->

                                            <xsl:copy-of select="xalan:nodeset($simple-table-id)"/>

                                        </xsl:variable>

                                        <!-- DEBUG: simple-table<xsl:copy-of select="$simple-table"/> -->

                                        <xsl:apply-templates select="xalan:nodeset($simple-table)" mode="process_table-if">
                                            <xsl:with-param name="table_or_dl">dl</xsl:with-param>
                                        </xsl:apply-templates>

                                    </xsl:when>
                                    <xsl:otherwise>

                                        <xsl:variable name="simple-table">

                                            <xsl:variable name="dl_table">
                                                <tbody>
                                                    <xsl:apply-templates mode="dl">
                                                        <xsl:with-param name="id" select="@id"/>
                                                    </xsl:apply-templates>
                                                </tbody>
                                            </xsl:variable>

                                            <xsl:copy-of select="$dl_table"/>
                                        </xsl:variable>

                                        <xsl:variable name="colwidths">
                                            <xsl:call-template name="calculate-column-widths">
                                                <xsl:with-param name="cols-count" select="2"/>
                                                <xsl:with-param name="table" select="$simple-table"/>
                                            </xsl:call-template>
                                        </xsl:variable>

                                        <!-- <xsl:text disable-output-escaping="yes">&lt;!- -</xsl:text>
                                            DEBUG
                                            colwidths=<xsl:copy-of select="$colwidths"/>
                                        <xsl:text disable-output-escaping="yes">- -&gt;</xsl:text> -->

                                        <!-- colwidths=<xsl:copy-of select="$colwidths"/> -->

                                        <xsl:variable name="maxlength_dt">
                                            <xsl:call-template name="getMaxLength_dt"/>
                                        </xsl:variable>

                                        <xsl:variable name="isContainsKeepTogetherTag_">
                                            false
                                        </xsl:variable>
                                        <xsl:variable name="isContainsKeepTogetherTag" select="normalize-space($isContainsKeepTogetherTag_)"/>
                                        <!-- isContainsExpressReference=<xsl:value-of select="$isContainsExpressReference"/> -->

                                        <xsl:call-template name="setColumnWidth_dl">
                                            <xsl:with-param name="colwidths" select="$colwidths"/>
                                            <xsl:with-param name="maxlength_dt" select="$maxlength_dt"/>
                                            <xsl:with-param name="isContainsKeepTogetherTag" select="$isContainsKeepTogetherTag"/>
                                        </xsl:call-template>

                                        <fo:table-body>

                                            <!-- DEBUG -->
                                            <xsl:if test="$table_if_debug = 'true'">
                                                <fo:table-row>
                                                    <fo:table-cell number-columns-spanned="2" font-size="60%">
                                                        <xsl:apply-templates select="xalan:nodeset($colwidths)" mode="print_as_xml"/>
                                                    </fo:table-cell>
                                                </fo:table-row>
                                            </xsl:if>

                                            <xsl:apply-templates>
                                                <xsl:with-param name="key_iso" select="normalize-space($key_iso)"/>
                                                <xsl:with-param name="split_keep-within-line" select="xalan:nodeset($colwidths)/split_keep-within-line"/>
                                            </xsl:apply-templates>

                                        </fo:table-body>
                                    </xsl:otherwise>
                                </xsl:choose>
                            </fo:table>
                        </fo:block>
                    </fo:block>
                </xsl:if> <!-- END: a few components -->
            </fo:block-container>
        </fo:block-container>

        <xsl:if test="$isGenerateTableIF = 'true'"> <!-- process nested 'dl' -->
            <xsl:apply-templates select="*[local-name() = 'dd']/*[local-name() = 'dl']"/>
        </xsl:if>

    </xsl:template> <!-- END: dl -->

    <xsl:template match="*[local-name() = 'dl']/*[local-name() = 'name']">
        <xsl:param name="process">false</xsl:param>
        <xsl:if test="$process = 'true'">
            <fo:block xsl:use-attribute-sets="dl-name-style">
                <xsl:apply-templates/>
            </fo:block>
        </xsl:if>
    </xsl:template>

    <xsl:template name="setColumnWidth_dl">
        <xsl:param name="colwidths"/>
        <xsl:param name="maxlength_dt"/>
        <xsl:param name="isContainsKeepTogetherTag"/>

        <!-- <colwidths><xsl:copy-of select="$colwidths"/></colwidths> -->

        <xsl:choose>
            <xsl:when test="xalan:nodeset($colwidths)/autolayout">
                <xsl:call-template name="insertTableColumnWidth">
                    <xsl:with-param name="colwidths" select="$colwidths"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="ancestor::*[local-name()='dl']"><!-- second level, i.e. inlined table -->
                <fo:table-column column-width="50%"/>
                <fo:table-column column-width="50%"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:choose>
                    <xsl:when test="xalan:nodeset($colwidths)/autolayout">
                        <xsl:call-template name="insertTableColumnWidth">
                            <xsl:with-param name="colwidths" select="$colwidths"/>
                        </xsl:call-template>
                    </xsl:when>
                    <xsl:when test="$isContainsKeepTogetherTag">
                        <xsl:call-template name="insertTableColumnWidth">
                            <xsl:with-param name="colwidths" select="$colwidths"/>
                        </xsl:call-template>
                    </xsl:when>
                    <!-- to set width check most wide chars like `W` -->
                    <xsl:when test="normalize-space($maxlength_dt) != '' and number($maxlength_dt) &lt;= 2"> <!-- if dt contains short text like t90, a, etc -->
                        <fo:table-column column-width="7%"/>
                        <fo:table-column column-width="93%"/>
                    </xsl:when>
                    <xsl:when test="normalize-space($maxlength_dt) != '' and number($maxlength_dt) &lt;= 5"> <!-- if dt contains short text like ABC, etc -->
                        <fo:table-column column-width="15%"/>
                        <fo:table-column column-width="85%"/>
                    </xsl:when>
                    <xsl:when test="normalize-space($maxlength_dt) != '' and number($maxlength_dt) &lt;= 7"> <!-- if dt contains short text like ABCDEF, etc -->
                        <fo:table-column column-width="20%"/>
                        <fo:table-column column-width="80%"/>
                    </xsl:when>
                    <xsl:when test="normalize-space($maxlength_dt) != '' and number($maxlength_dt) &lt;= 10"> <!-- if dt contains short text like ABCDEFEF, etc -->
                        <fo:table-column column-width="25%"/>
                        <fo:table-column column-width="75%"/>
                    </xsl:when>
                    <!-- <xsl:when test="xalan:nodeset($colwidths)/column[1] div xalan:nodeset($colwidths)/column[2] &gt; 1.7">
                        <fo:table-column column-width="60%"/>
                        <fo:table-column column-width="40%"/>
                    </xsl:when> -->
                    <xsl:when test="xalan:nodeset($colwidths)/column[1] div xalan:nodeset($colwidths)/column[2] &gt; 1.3">
                        <fo:table-column column-width="50%"/>
                        <fo:table-column column-width="50%"/>
                    </xsl:when>
                    <xsl:when test="xalan:nodeset($colwidths)/column[1] div xalan:nodeset($colwidths)/column[2] &gt; 0.5">
                        <fo:table-column column-width="40%"/>
                        <fo:table-column column-width="60%"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:call-template name="insertTableColumnWidth">
                            <xsl:with-param name="colwidths" select="$colwidths"/>
                        </xsl:call-template>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="insertTableColumnWidth">
        <xsl:param name="colwidths"/>

        <xsl:for-each select="xalan:nodeset($colwidths)//column">
            <xsl:choose>
                <xsl:when test=". = 1 or . = 0">
                    <fo:table-column column-width="proportional-column-width(2)"/>
                </xsl:when>
                <xsl:otherwise>
                    <!-- <fo:table-column column-width="proportional-column-width({.})"/> -->
                    <xsl:variable name="divider">
                        <xsl:value-of select="@divider"/>
                        <xsl:if test="not(@divider)">1</xsl:if>
                    </xsl:variable>
                    <fo:table-column column-width="proportional-column-width({round(. div $divider)})"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="getMaxLength_dt">
        <xsl:variable name="lengths">
            <xsl:for-each select="*[local-name()='dt']">
                <xsl:variable name="maintext_length" select="string-length(normalize-space(.))"/>
                <xsl:variable name="attributes">
                    <xsl:for-each select=".//@open"><xsl:value-of select="."/></xsl:for-each>
                    <xsl:for-each select=".//@close"><xsl:value-of select="."/></xsl:for-each>
                </xsl:variable>
                <length><xsl:value-of select="string-length(normalize-space(.)) + string-length($attributes)"/></length>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="maxLength">
            <xsl:for-each select="xalan:nodeset($lengths)/length">
                <xsl:sort select="." data-type="number" order="descending"/>
                <xsl:if test="position() = 1">
                    <xsl:value-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <!-- <xsl:message>DEBUG:<xsl:value-of select="$maxLength"/></xsl:message> -->
        <xsl:value-of select="$maxLength"/>
    </xsl:template>

    <!-- note in definition list: dl/note -->
    <!-- renders in the 2-column spanned table row -->
    <xsl:template match="*[local-name()='dl']/*[local-name()='note']" priority="2">
        <xsl:param name="key_iso"/>
        <!-- <tr>
            <td>NOTE</td>
            <td>
                <xsl:apply-templates />
            </td>
        </tr>
         -->
        <!-- OLD Variant -->
        <!-- <fo:table-row>
            <fo:table-cell>
                <fo:block margin-top="6pt">
                    <xsl:if test="normalize-space($key_iso) = 'true'">
                        <xsl:attribute name="margin-top">0</xsl:attribute>
                    </xsl:if>
                    <xsl:apply-templates select="*[local-name() = 'name']" />
                </fo:block>
            </fo:table-cell>
            <fo:table-cell>
                <fo:block>
                    <xsl:apply-templates select="node()[not(local-name() = 'name')]" />
                </fo:block>
            </fo:table-cell>
        </fo:table-row> -->
        <!-- <tr>
            <td number-columns-spanned="2">NOTE <xsl:apply-templates /> </td>
        </tr> 
        -->
        <fo:table-row>
            <fo:table-cell number-columns-spanned="2">
                <fo:block>
                    <xsl:call-template name="note"/>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template> <!-- END: dl/note -->

    <!-- virtual html table for dl/[dt and dd]  -->
    <xsl:template match="*[local-name()='dt']" mode="dl">
        <xsl:param name="id"/>
        <xsl:variable name="row_number" select="count(preceding-sibling::*[local-name()='dt']) + 1"/>
        <tr>
            <td>
                <xsl:attribute name="id">
                    <xsl:value-of select="concat($id,'_',$row_number,'_1')"/>
                </xsl:attribute>
                <xsl:apply-templates/>
            </td>
            <td>
                <xsl:attribute name="id">
                    <xsl:value-of select="concat($id,'_',$row_number,'_2')"/>
                </xsl:attribute>

                        <xsl:apply-templates select="following-sibling::*[local-name()='dd'][1]">
                            <xsl:with-param name="process">true</xsl:with-param>
                        </xsl:apply-templates>

            </td>
        </tr>

    </xsl:template>

    <!-- Definition's term -->
    <xsl:template match="*[local-name()='dt']">
        <xsl:param name="key_iso"/>
        <xsl:param name="split_keep-within-line"/>

        <fo:table-row xsl:use-attribute-sets="dt-row-style">
            <xsl:call-template name="insert_dt_cell">
                <xsl:with-param name="key_iso" select="$key_iso"/>
                <xsl:with-param name="split_keep-within-line" select="$split_keep-within-line"/>
            </xsl:call-template>
            <xsl:for-each select="following-sibling::*[local-name()='dd'][1]">
                <xsl:call-template name="insert_dd_cell">
                    <xsl:with-param name="split_keep-within-line" select="$split_keep-within-line"/>
                </xsl:call-template>
            </xsl:for-each>
        </fo:table-row>
    </xsl:template> <!-- END: dt -->

    <xsl:template name="insert_dt_cell">
        <xsl:param name="key_iso"/>
        <xsl:param name="split_keep-within-line"/>
        <fo:table-cell xsl:use-attribute-sets="dt-cell-style">

            <xsl:if test="$isGenerateTableIF = 'true'">
                <!-- border is mandatory, to calculate real width -->
                <xsl:attribute name="border">0.1pt solid black</xsl:attribute>
                <xsl:attribute name="text-align">left</xsl:attribute>
            </xsl:if>

            <fo:block xsl:use-attribute-sets="dt-block-style">
                <xsl:copy-of select="@id"/>

                <xsl:if test="normalize-space($key_iso) = 'true'">
                    <xsl:attribute name="margin-top">0</xsl:attribute>
                </xsl:if>

                <xsl:apply-templates>
                    <xsl:with-param name="split_keep-within-line" select="$split_keep-within-line"/>
                </xsl:apply-templates>

                <xsl:if test="$isGenerateTableIF = 'true'"><fo:inline id="{@id}_end">end</fo:inline></xsl:if> <!-- to determine width of text --> <!-- <xsl:value-of select="$hair_space"/> -->

            </fo:block>
        </fo:table-cell>
    </xsl:template> <!-- insert_dt_cell -->

    <xsl:template name="insert_dd_cell">
        <xsl:param name="split_keep-within-line"/>
        <fo:table-cell xsl:use-attribute-sets="dd-cell-style">

            <xsl:if test="$isGenerateTableIF = 'true'">
                <!-- border is mandatory, to calculate real width -->
                <xsl:attribute name="border">0.1pt solid black</xsl:attribute>
            </xsl:if>

            <fo:block>

                <xsl:if test="$isGenerateTableIF = 'true'">
                    <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
                </xsl:if>

                <xsl:choose>
                    <xsl:when test="$isGenerateTableIF = 'true'">
                        <xsl:apply-templates> <!-- following-sibling::*[local-name()='dd'][1] -->
                            <xsl:with-param name="process">true</xsl:with-param>
                        </xsl:apply-templates>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="."> <!-- following-sibling::*[local-name()='dd'][1] -->
                            <xsl:with-param name="process">true</xsl:with-param>
                            <xsl:with-param name="split_keep-within-line" select="$split_keep-within-line"/>
                        </xsl:apply-templates>
                    </xsl:otherwise>

                </xsl:choose>

                <xsl:if test="$isGenerateTableIF = 'true'"><fo:inline id="{@id}_end">end</fo:inline></xsl:if> <!-- to determine width of text --> <!-- <xsl:value-of select="$hair_space"/> -->

            </fo:block>
        </fo:table-cell>
    </xsl:template> <!-- insert_dd_cell -->

    <!-- END Definition's term -->

    <xsl:template match="*[local-name()='dd']" mode="dl"/>
    <xsl:template match="*[local-name()='dd']" mode="dl_process">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="*[local-name()='dd']">
        <xsl:param name="process">false</xsl:param>
        <xsl:param name="split_keep-within-line"/>
        <xsl:if test="$process = 'true'">
            <xsl:apply-templates select="@language"/>
            <xsl:apply-templates>
                <xsl:with-param name="split_keep-within-line" select="$split_keep-within-line"/>
            </xsl:apply-templates>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name()='dd']/*[local-name()='p']" mode="inline">
        <fo:inline><xsl:text> </xsl:text><xsl:apply-templates/></fo:inline>
    </xsl:template>

    <!-- virtual html table for dl/[dt and dd] for IF (Intermediate Format) -->
    <xsl:template match="*[local-name()='dt']" mode="dl_if">
        <xsl:param name="id"/>
        <tr>
            <td>
                <xsl:copy-of select="node()"/>
            </td>
            <td>
                <xsl:copy-of select="following-sibling::*[local-name()='dd'][1]/node()[not(local-name() = 'dl')]"/>
                <!-- get paragraphs from nested 'dl' -->
                <xsl:apply-templates select="following-sibling::*[local-name()='dd'][1]/*[local-name() = 'dl']" mode="dl_if_nested"/>
            </td>
        </tr>
    </xsl:template>
    <xsl:template match="*[local-name()='dd']" mode="dl_if"/>

    <xsl:template match="*[local-name()='dl']" mode="dl_if_nested">
        <xsl:for-each select="*[local-name() = 'dt']">
            <p>
                <xsl:copy-of select="node()"/>
                <xsl:text> </xsl:text>
                <xsl:copy-of select="following-sibling::*[local-name()='dd'][1]/*[local-name() = 'p']/node()"/>
            </p>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="*[local-name()='dd']" mode="dl_if_nested"/>
    <!-- ===================== -->
    <!-- END Definition List -->
    <!-- ===================== -->

    <!-- ========================= -->
    <!-- Rich text formatting -->
    <!-- ========================= -->
    <xsl:template match="*[local-name()='em']">
        <fo:inline font-style="italic">
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name()='strong'] | *[local-name()='b']">
        <xsl:param name="split_keep-within-line"/>
        <fo:inline font-weight="bold">

            <xsl:apply-templates>
                <xsl:with-param name="split_keep-within-line" select="$split_keep-within-line"/>
            </xsl:apply-templates>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name()='padding']">
        <fo:inline padding-right="{@value}"> </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name()='sup']">
        <fo:inline font-size="80%" vertical-align="super">
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name()='sub']">
        <fo:inline font-size="80%" vertical-align="sub">
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name()='tt']">
        <fo:inline xsl:use-attribute-sets="tt-style">

            <xsl:variable name="_font-size">

                10


                 <!-- 10 -->

            </xsl:variable>
            <xsl:variable name="font-size" select="normalize-space($_font-size)"/>
            <xsl:if test="$font-size != ''">
                <xsl:attribute name="font-size">
                    <xsl:choose>
                        <xsl:when test="$font-size = 'inherit'"><xsl:value-of select="$font-size"/></xsl:when>
                        <xsl:when test="contains($font-size, '%')"><xsl:value-of select="$font-size"/></xsl:when>
                        <xsl:when test="ancestor::*[local-name()='note'] or ancestor::*[local-name()='example']"><xsl:value-of select="$font-size * 0.91"/>pt</xsl:when>
                        <xsl:otherwise><xsl:value-of select="$font-size"/>pt</xsl:otherwise>
                    </xsl:choose>
                </xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template> <!-- tt -->

    <xsl:template match="*[local-name()='tt']/text()" priority="2">
        <xsl:call-template name="add_spaces_to_sourcecode"/>
    </xsl:template>

    <xsl:template match="*[local-name()='underline']">
        <fo:inline text-decoration="underline">
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <!-- ================= -->
    <!-- Added,deleted text -->
    <!-- ================= -->
    <xsl:template match="*[local-name()='add']" name="tag_add">
        <xsl:param name="skip">true</xsl:param>
        <xsl:param name="block">false</xsl:param>
        <xsl:param name="type"/>
        <xsl:param name="text-align"/>
        <xsl:choose>
            <xsl:when test="starts-with(., $ace_tag)"> <!-- examples: ace-tag_A1_start, ace-tag_A2_end, C1_start, AC_start -->
                <xsl:choose>
                    <xsl:when test="$skip = 'true' and       ((local-name(../..) = 'note' and not(preceding-sibling::node())) or       (local-name(..) = 'title' and preceding-sibling::node()[1][local-name() = 'tab']) or      local-name(..) = 'formattedref' and not(preceding-sibling::node()))      and       ../node()[last()][local-name() = 'add'][starts-with(text(), $ace_tag)]"><!-- start tag displayed in template name="note" and title --></xsl:when>
                    <xsl:otherwise>
                        <xsl:variable name="tag">
                            <xsl:call-template name="insertTag">
                                <xsl:with-param name="type">
                                    <xsl:choose>
                                        <xsl:when test="$type = ''"><xsl:value-of select="substring-after(substring-after(., $ace_tag), '_')"/> <!-- start or end --></xsl:when>
                                        <xsl:otherwise><xsl:value-of select="$type"/></xsl:otherwise>
                                    </xsl:choose>
                                </xsl:with-param>
                                <xsl:with-param name="kind" select="substring(substring-before(substring-after(., $ace_tag), '_'), 1, 1)"/> <!-- A or C -->
                                <xsl:with-param name="value" select="substring(substring-before(substring-after(., $ace_tag), '_'), 2)"/> <!-- 1, 2, C -->
                            </xsl:call-template>
                        </xsl:variable>
                        <xsl:choose>
                            <xsl:when test="$block = 'false'">
                                <fo:inline>
                                    <xsl:copy-of select="$tag"/>
                                </fo:inline>
                            </xsl:when>
                            <xsl:otherwise>
                                <fo:block> <!-- for around figures -->
                                    <xsl:if test="$text-align != ''">
                                        <xsl:attribute name="text-align"><xsl:value-of select="$text-align"/></xsl:attribute>
                                    </xsl:if>
                                    <xsl:copy-of select="$tag"/>
                                </fo:block>
                            </xsl:otherwise>
                        </xsl:choose>

                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:when test="@amendment">
                <fo:inline>
                    <xsl:call-template name="insertTag">
                        <xsl:with-param name="kind">A</xsl:with-param>
                        <xsl:with-param name="value"><xsl:value-of select="@amendment"/></xsl:with-param>
                    </xsl:call-template>
                    <xsl:apply-templates/>
                    <xsl:call-template name="insertTag">
                        <xsl:with-param name="type">closing</xsl:with-param>
                        <xsl:with-param name="kind">A</xsl:with-param>
                        <xsl:with-param name="value"><xsl:value-of select="@amendment"/></xsl:with-param>
                    </xsl:call-template>
                </fo:inline>
            </xsl:when>
            <xsl:when test="@corrigenda">
                <fo:inline>
                    <xsl:call-template name="insertTag">
                        <xsl:with-param name="kind">C</xsl:with-param>
                        <xsl:with-param name="value"><xsl:value-of select="@corrigenda"/></xsl:with-param>
                    </xsl:call-template>
                    <xsl:apply-templates/>
                    <xsl:call-template name="insertTag">
                        <xsl:with-param name="type">closing</xsl:with-param>
                        <xsl:with-param name="kind">C</xsl:with-param>
                        <xsl:with-param name="value"><xsl:value-of select="@corrigenda"/></xsl:with-param>
                    </xsl:call-template>
                </fo:inline>
            </xsl:when>
            <xsl:otherwise>
                <fo:inline xsl:use-attribute-sets="add-style">
                    <xsl:apply-templates/>
                </fo:inline>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- add -->

    <xsl:template name="insertTag">
        <xsl:param name="type"/>
        <xsl:param name="kind"/>
        <xsl:param name="value"/>
        <xsl:variable name="add_width" select="string-length($value) * 20"/>
        <xsl:variable name="maxwidth" select="60 + $add_width"/>
            <fo:instream-foreign-object fox:alt-text="OpeningTag" baseline-shift="-20%"><!-- alignment-baseline="middle" -->
                <xsl:attribute name="height">5mm</xsl:attribute>
                <xsl:attribute name="content-width">100%</xsl:attribute>
                <xsl:attribute name="content-width">scale-down-to-fit</xsl:attribute>
                <xsl:attribute name="scaling">uniform</xsl:attribute>
                <svg xmlns="http://www.w3.org/2000/svg" width="{$maxwidth + 32}" height="80">
                    <g>
                        <xsl:if test="$type = 'closing' or $type = 'end'">
                            <xsl:attribute name="transform">scale(-1 1) translate(-<xsl:value-of select="$maxwidth + 32"/>,0)</xsl:attribute>
                        </xsl:if>
                        <polyline points="0,0 {$maxwidth},0 {$maxwidth + 30},40 {$maxwidth},80 0,80 " stroke="black" stroke-width="5" fill="white"/>
                        <line x1="0" y1="0" x2="0" y2="80" stroke="black" stroke-width="20"/>
                    </g>
                    <text font-family="Arial" x="15" y="57" font-size="40pt">
                        <xsl:if test="$type = 'closing' or $type = 'end'">
                            <xsl:attribute name="x">25</xsl:attribute>
                        </xsl:if>
                        <xsl:value-of select="$kind"/><tspan dy="10" font-size="30pt"><xsl:value-of select="$value"/></tspan>
                    </text>
                </svg>
            </fo:instream-foreign-object>
    </xsl:template>

    <xsl:template match="*[local-name()='del']">
        <fo:inline xsl:use-attribute-sets="del-style">
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>
    <!-- ================= -->
    <!-- END Added,deleted text -->
    <!-- ================= -->

    <!-- highlight text -->
    <xsl:template match="*[local-name()='hi']">
        <fo:inline background-color="yellow">
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="text()[ancestor::*[local-name()='smallcap']]">
        <xsl:variable name="text" select="normalize-space(.)"/>
        <fo:inline font-size="75%">
                <xsl:if test="string-length($text) &gt; 0">
                    <xsl:call-template name="recursiveSmallCaps">
                        <xsl:with-param name="text" select="$text"/>
                    </xsl:call-template>
                </xsl:if>
            </fo:inline>
    </xsl:template>

    <xsl:template name="recursiveSmallCaps">
    <xsl:param name="text"/>
    <xsl:variable name="char" select="substring($text,1,1)"/>
    <!-- <xsl:variable name="upperCase" select="translate($char, $lower, $upper)"/> -->
        <xsl:variable name="upperCase" select="java:toUpperCase(java:java.lang.String.new($char))"/>
    <xsl:choose>
      <xsl:when test="$char=$upperCase">
        <fo:inline font-size="{100 div 0.75}%">
          <xsl:value-of select="$upperCase"/>
        </fo:inline>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$upperCase"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="string-length($text) &gt; 1">
      <xsl:call-template name="recursiveSmallCaps">
        <xsl:with-param name="text" select="substring($text,2)"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

    <xsl:template match="*[local-name() = 'pagebreak']">
        <fo:block break-after="page"/>
        <fo:block> </fo:block>
        <fo:block break-after="page"/>
    </xsl:template>

    <!-- Example: <span style="font-family:&quot;Noto Sans JP&quot;">styled text</span> -->
    <xsl:template match="*[local-name() = 'span'][@style]" priority="2">
        <xsl:variable name="styles__">
            <xsl:call-template name="split">
                <xsl:with-param name="pText" select="concat(@style,';')"/>
                <xsl:with-param name="sep" select="';'"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:variable name="quot">"</xsl:variable>
        <xsl:variable name="styles_">
            <xsl:for-each select="xalan:nodeset($styles__)/item">
                <xsl:variable name="key" select="normalize-space(substring-before(., ':'))"/>
                <xsl:variable name="value" select="normalize-space(substring-after(translate(.,$quot,''), ':'))"/>
                <xsl:if test="$key = 'font-family' or $key = 'color'">
                    <style name="{$key}"><xsl:value-of select="$value"/></style>
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="styles" select="xalan:nodeset($styles_)"/>
        <xsl:choose>
            <xsl:when test="$styles/style">
                <fo:inline>
                    <xsl:for-each select="$styles/style">
                        <xsl:attribute name="{@name}"><xsl:value-of select="."/></xsl:attribute>
                    </xsl:for-each>
                    <xsl:apply-templates/>
                </fo:inline>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- END: span[@style] -->

    <!-- Note: to enable the addition of character span markup with semantic styling for DIS Word output -->
    <xsl:template match="*[local-name() = 'span']">
        <xsl:apply-templates/>
    </xsl:template>

    <!-- ========================= -->
    <!-- END Rich text formatting -->
    <!-- ========================= -->

    <!-- split string 'text' by 'separator' -->
    <xsl:template name="tokenize">
        <xsl:param name="text"/>
        <xsl:param name="separator" select="' '"/>
        <xsl:choose>

            <xsl:when test="$isGenerateTableIF = 'true' and not(contains($text, $separator))">
                <word><xsl:value-of select="normalize-space($text)"/></word>
            </xsl:when>
            <xsl:when test="not(contains($text, $separator))">
                <word>
                    <xsl:variable name="len_str_tmp" select="string-length(normalize-space($text))"/>
                    <xsl:choose>
                        <xsl:when test="normalize-space(translate($text, 'X', '')) = ''"> <!-- special case for keep-together.within-line -->
                            <xsl:value-of select="$len_str_tmp"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:variable name="str_no_en_chars" select="normalize-space(translate($text, $en_chars, ''))"/>
                            <xsl:variable name="len_str_no_en_chars" select="string-length($str_no_en_chars)"/>
                            <xsl:variable name="len_str">
                                <xsl:choose>
                                    <xsl:when test="normalize-space(translate($text, $upper, '')) = ''"> <!-- english word in CAPITAL letters -->
                                        <xsl:value-of select="$len_str_tmp * 1.5"/>
                                    </xsl:when>
                                    <xsl:otherwise>
                                        <xsl:value-of select="$len_str_tmp"/>
                                    </xsl:otherwise>
                                </xsl:choose>
                            </xsl:variable>

                            <!-- <xsl:if test="$len_str_no_en_chars div $len_str &gt; 0.8">
                                <xsl:message>
                                    div=<xsl:value-of select="$len_str_no_en_chars div $len_str"/>
                                    len_str=<xsl:value-of select="$len_str"/>
                                    len_str_no_en_chars=<xsl:value-of select="$len_str_no_en_chars"/>
                                </xsl:message>
                            </xsl:if> -->
                            <!-- <len_str_no_en_chars><xsl:value-of select="$len_str_no_en_chars"/></len_str_no_en_chars>
                            <len_str><xsl:value-of select="$len_str"/></len_str> -->
                            <xsl:choose>
                                <xsl:when test="$len_str_no_en_chars div $len_str &gt; 0.8"> <!-- means non-english string -->
                                    <xsl:value-of select="$len_str - $len_str_no_en_chars"/>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="$len_str"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:otherwise>
                    </xsl:choose>
                </word>
            </xsl:when>
            <xsl:otherwise>
                <word>
                    <xsl:variable name="word" select="normalize-space(substring-before($text, $separator))"/>
                    <xsl:choose>
                        <xsl:when test="$isGenerateTableIF = 'true'">
                            <xsl:value-of select="$word"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="string-length($word)"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </word>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="text" select="substring-after($text, $separator)"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- split string 'text' by 'separator', enclosing in formatting tags -->
    <xsl:template name="tokenize_with_tags">
        <xsl:param name="tags"/>
        <xsl:param name="text"/>
        <xsl:param name="separator" select="' '"/>
        <xsl:choose>

            <xsl:when test="not(contains($text, $separator))">
                <word>
                    <xsl:call-template name="enclose_text_in_tags">
                        <xsl:with-param name="text" select="normalize-space($text)"/>
                        <xsl:with-param name="tags" select="$tags"/>
                    </xsl:call-template>
                </word>
            </xsl:when>
            <xsl:otherwise>
                <word>
                    <xsl:call-template name="enclose_text_in_tags">
                        <xsl:with-param name="text" select="normalize-space(substring-before($text, $separator))"/>
                        <xsl:with-param name="tags" select="$tags"/>
                    </xsl:call-template>
                </word>
                <xsl:call-template name="tokenize_with_tags">
                    <xsl:with-param name="text" select="substring-after($text, $separator)"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="enclose_text_in_tags">
        <xsl:param name="text"/>
        <xsl:param name="tags"/>
        <xsl:param name="num">1</xsl:param> <!-- default (start) value -->

        <xsl:variable name="tag_name" select="normalize-space(xalan:nodeset($tags)//tag[$num])"/>

        <xsl:choose>
            <xsl:when test="$tag_name = ''"><xsl:value-of select="$text"/></xsl:when>
            <xsl:otherwise>
                <xsl:element name="{$tag_name}">
                    <xsl:call-template name="enclose_text_in_tags">
                        <xsl:with-param name="text" select="$text"/>
                        <xsl:with-param name="tags" select="$tags"/>
                        <xsl:with-param name="num" select="$num + 1"/>
                    </xsl:call-template>
                </xsl:element>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- get max value in array -->
    <xsl:template name="max_length">
        <xsl:param name="words"/>
        <xsl:for-each select="$words//word">
                <xsl:sort select="." data-type="number" order="descending"/>
                <xsl:if test="position()=1">
                        <xsl:value-of select="."/>
                </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="add-zero-spaces-java">
        <xsl:param name="text" select="."/>
        <!-- add zero-width space (#x200B) after characters: dash, dot, colon, equal, underscore, em dash, thin space  -->
        <xsl:value-of select="java:replaceAll(java:java.lang.String.new($text),'(-|\.|:|=|_|—| )','$1​')"/>
    </xsl:template>

    <xsl:template name="add-zero-spaces-link-java">
        <xsl:param name="text" select="."/>
        <!-- add zero-width space (#x200B) after characters: dash, dot, colon, equal, underscore, em dash, thin space  -->
        <xsl:value-of select="java:replaceAll(java:java.lang.String.new($text),'(-|\.|:|=|_|—| |,)','$1​')"/>
    </xsl:template>

    <!-- add zero space after dash character (for table's entries) -->
    <xsl:template name="add-zero-spaces">
        <xsl:param name="text" select="."/>
        <xsl:variable name="zero-space-after-chars">-</xsl:variable>
        <xsl:variable name="zero-space-after-dot">.</xsl:variable>
        <xsl:variable name="zero-space-after-colon">:</xsl:variable>
        <xsl:variable name="zero-space-after-equal">=</xsl:variable>
        <xsl:variable name="zero-space-after-underscore">_</xsl:variable>
        <xsl:variable name="zero-space">​</xsl:variable>
        <xsl:choose>
            <xsl:when test="contains($text, $zero-space-after-chars)">
                <xsl:value-of select="substring-before($text, $zero-space-after-chars)"/>
                <xsl:value-of select="$zero-space-after-chars"/>
                <xsl:value-of select="$zero-space"/>
                <xsl:call-template name="add-zero-spaces">
                    <xsl:with-param name="text" select="substring-after($text, $zero-space-after-chars)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="contains($text, $zero-space-after-dot)">
                <xsl:value-of select="substring-before($text, $zero-space-after-dot)"/>
                <xsl:value-of select="$zero-space-after-dot"/>
                <xsl:value-of select="$zero-space"/>
                <xsl:call-template name="add-zero-spaces">
                    <xsl:with-param name="text" select="substring-after($text, $zero-space-after-dot)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="contains($text, $zero-space-after-colon)">
                <xsl:value-of select="substring-before($text, $zero-space-after-colon)"/>
                <xsl:value-of select="$zero-space-after-colon"/>
                <xsl:value-of select="$zero-space"/>
                <xsl:call-template name="add-zero-spaces">
                    <xsl:with-param name="text" select="substring-after($text, $zero-space-after-colon)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="contains($text, $zero-space-after-equal)">
                <xsl:value-of select="substring-before($text, $zero-space-after-equal)"/>
                <xsl:value-of select="$zero-space-after-equal"/>
                <xsl:value-of select="$zero-space"/>
                <xsl:call-template name="add-zero-spaces">
                    <xsl:with-param name="text" select="substring-after($text, $zero-space-after-equal)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="contains($text, $zero-space-after-underscore)">
                <xsl:value-of select="substring-before($text, $zero-space-after-underscore)"/>
                <xsl:value-of select="$zero-space-after-underscore"/>
                <xsl:value-of select="$zero-space"/>
                <xsl:call-template name="add-zero-spaces">
                    <xsl:with-param name="text" select="substring-after($text, $zero-space-after-underscore)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="add-zero-spaces-equal">
        <xsl:param name="text" select="."/>
        <xsl:variable name="zero-space-after-equals">==========</xsl:variable>
        <xsl:variable name="regex_zero-space-after-equals">(==========)</xsl:variable>
        <xsl:variable name="zero-space-after-equal">=</xsl:variable>
        <xsl:variable name="regex_zero-space-after-equal">(=)</xsl:variable>
        <xsl:variable name="zero-space">​</xsl:variable>
        <xsl:choose>
            <xsl:when test="contains($text, $zero-space-after-equals)">
                <!-- <xsl:value-of select="substring-before($text, $zero-space-after-equals)"/>
                <xsl:value-of select="$zero-space-after-equals"/>
                <xsl:value-of select="$zero-space"/>
                <xsl:call-template name="add-zero-spaces-equal">
                    <xsl:with-param name="text" select="substring-after($text, $zero-space-after-equals)"/>
                </xsl:call-template> -->
                <xsl:value-of select="java:replaceAll(java:java.lang.String.new(.),$regex_zero-space-after-equals,concat('$1',$zero_width_space))"/>
            </xsl:when>
            <xsl:when test="contains($text, $zero-space-after-equal)">
                <!-- <xsl:value-of select="substring-before($text, $zero-space-after-equal)"/>
                <xsl:value-of select="$zero-space-after-equal"/>
                <xsl:value-of select="$zero-space"/>
                <xsl:call-template name="add-zero-spaces-equal">
                    <xsl:with-param name="text" select="substring-after($text, $zero-space-after-equal)"/>
                </xsl:call-template> -->
                <xsl:value-of select="java:replaceAll(java:java.lang.String.new(.),$regex_zero-space-after-equal,concat('$1',$zero_width_space))"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- Table normalization (colspan,rowspan processing for adding TDs) for column width calculation -->
    <xsl:template name="getSimpleTable">
        <xsl:param name="id"/>

        <xsl:variable name="simple-table">

            <!-- Step 0. replace <br/> to <p>...</p> -->
            <xsl:variable name="table_without_br">
                <xsl:apply-templates mode="table-without-br"/>
            </xsl:variable>

            <!-- Step 1. colspan processing -->
            <xsl:variable name="simple-table-colspan">
                <tbody>
                    <xsl:apply-templates select="xalan:nodeset($table_without_br)" mode="simple-table-colspan"/>
                </tbody>
            </xsl:variable>

            <!-- Step 2. rowspan processing -->
            <xsl:variable name="simple-table-rowspan">
                <xsl:apply-templates select="xalan:nodeset($simple-table-colspan)" mode="simple-table-rowspan"/>
            </xsl:variable>

            <!-- Step 3: add id to each cell -->
            <!-- add <word>...</word> for each word, image, math -->
            <xsl:variable name="simple-table-id">
                <xsl:apply-templates select="xalan:nodeset($simple-table-rowspan)" mode="simple-table-id">
                    <xsl:with-param name="id" select="$id"/>
                </xsl:apply-templates>
            </xsl:variable>

            <xsl:copy-of select="xalan:nodeset($simple-table-id)"/>

        </xsl:variable>
        <xsl:copy-of select="$simple-table"/>
    </xsl:template>

    <!-- ================================== -->
    <!-- Step 0. replace <br/> to <p>...</p> -->
    <!-- ================================== -->
    <xsl:template match="@*|node()" mode="table-without-br">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="table-without-br"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name()='th' or local-name() = 'td'][not(*[local-name()='br']) and not(*[local-name()='p'])]" mode="table-without-br">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <p>
                <xsl:copy-of select="node()"/>
            </p>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name()='th' or local-name()='td'][*[local-name()='br']]" mode="table-without-br">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:for-each select="*[local-name()='br']">
                <xsl:variable name="current_id" select="generate-id()"/>
                <p>
                    <xsl:for-each select="preceding-sibling::node()[following-sibling::*[local-name() = 'br'][1][generate-id() = $current_id]][not(local-name() = 'br')]">
                        <xsl:copy-of select="."/>
                    </xsl:for-each>
                </p>
                <xsl:if test="not(following-sibling::*[local-name() = 'br'])">
                    <p>
                        <xsl:for-each select="following-sibling::node()">
                            <xsl:copy-of select="."/>
                        </xsl:for-each>
                    </p>
                </xsl:if>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name()='th' or local-name()='td']/*[local-name() = 'p'][*[local-name()='br']]" mode="table-without-br">
        <xsl:for-each select="*[local-name()='br']">
            <xsl:variable name="current_id" select="generate-id()"/>
            <p>
                <xsl:for-each select="preceding-sibling::node()[following-sibling::*[local-name() = 'br'][1][generate-id() = $current_id]][not(local-name() = 'br')]">
                    <xsl:copy-of select="."/>
                </xsl:for-each>
            </p>
            <xsl:if test="not(following-sibling::*[local-name() = 'br'])">
                <p>
                    <xsl:for-each select="following-sibling::node()">
                        <xsl:copy-of select="."/>
                    </xsl:for-each>
                </p>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <!-- remove redundant white spaces -->
    <xsl:template match="text()[not(ancestor::*[local-name() = 'sourcecode'])]" mode="table-without-br">
        <xsl:variable name="text" select="translate(.,'&#9;&#10;&#13;','')"/>
        <xsl:value-of select="java:replaceAll(java:java.lang.String.new($text),' {2,}',' ')"/>
    </xsl:template>

    <!-- mode="table-without-br" -->
    <!-- ================================== -->
    <!-- END: Step 0. replace <br/> to <p>...</p> -->
    <!-- ================================== -->

    <!-- ===================== -->
    <!-- 1. mode "simple-table-colspan" 
            1.1. remove thead, tbody, fn
            1.2. rename th -> td
            1.3. repeating N td with colspan=N
            1.4. remove namespace
            1.5. remove @colspan attribute
            1.6. add @divide attribute for divide text width in further processing 
    -->
    <!-- ===================== -->
    <xsl:template match="*[local-name()='thead'] | *[local-name()='tbody']" mode="simple-table-colspan">
        <xsl:apply-templates mode="simple-table-colspan"/>
    </xsl:template>
    <xsl:template match="*[local-name()='fn']" mode="simple-table-colspan"/>

    <xsl:template match="*[local-name()='th'] | *[local-name()='td']" mode="simple-table-colspan">
        <xsl:choose>
            <xsl:when test="@colspan">
                <xsl:variable name="td">
                    <xsl:element name="td">
                        <xsl:attribute name="divide"><xsl:value-of select="@colspan"/></xsl:attribute>
                        <xsl:if test="local-name()='th'">
                            <xsl:attribute name="font-weight">bold</xsl:attribute>
                        </xsl:if>
                        <xsl:apply-templates select="@*" mode="simple-table-colspan"/>
                        <xsl:apply-templates mode="simple-table-colspan"/>
                    </xsl:element>
                </xsl:variable>
                <xsl:call-template name="repeatNode">
                    <xsl:with-param name="count" select="@colspan"/>
                    <xsl:with-param name="node" select="$td"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:element name="td">
                    <xsl:apply-templates select="@*" mode="simple-table-colspan"/>
                    <xsl:if test="local-name()='th'">
                        <xsl:attribute name="font-weight">bold</xsl:attribute>
                    </xsl:if>
                    <xsl:apply-templates mode="simple-table-colspan"/>
                </xsl:element>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="@colspan" mode="simple-table-colspan"/>

    <xsl:template match="*[local-name()='tr']" mode="simple-table-colspan">
        <xsl:element name="tr">
            <xsl:apply-templates select="@*" mode="simple-table-colspan"/>
            <xsl:apply-templates mode="simple-table-colspan"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*|node()" mode="simple-table-colspan">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="simple-table-colspan"/>
        </xsl:copy>
    </xsl:template>

    <!-- repeat node 'count' times -->
    <xsl:template name="repeatNode">
        <xsl:param name="count"/>
        <xsl:param name="node"/>

        <xsl:if test="$count &gt; 0">
            <xsl:call-template name="repeatNode">
                <xsl:with-param name="count" select="$count - 1"/>
                <xsl:with-param name="node" select="$node"/>
            </xsl:call-template>
            <xsl:copy-of select="$node"/>
        </xsl:if>
    </xsl:template>
    <!-- End mode simple-table-colspan  -->
    <!-- ===================== -->
    <!-- ===================== -->

    <!-- ===================== -->
    <!-- 2. mode "simple-table-rowspan" 
    Row span processing, more information http://andrewjwelch.com/code/xslt/table/table-normalization.html    -->
    <!-- ===================== -->
    <xsl:template match="@*|node()" mode="simple-table-rowspan">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="simple-table-rowspan"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="tbody" mode="simple-table-rowspan">
        <xsl:copy>
                <xsl:copy-of select="tr[1]"/>
                <xsl:apply-templates select="tr[2]" mode="simple-table-rowspan">
                        <xsl:with-param name="previousRow" select="tr[1]"/>
                </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="tr" mode="simple-table-rowspan">
        <xsl:param name="previousRow"/>
        <xsl:variable name="currentRow" select="."/>

        <xsl:variable name="normalizedTDs">
                <xsl:for-each select="xalan:nodeset($previousRow)//td">
                        <xsl:choose>
                                <xsl:when test="@rowspan &gt; 1">
                                        <xsl:copy>
                                                <xsl:attribute name="rowspan">
                                                        <xsl:value-of select="@rowspan - 1"/>
                                                </xsl:attribute>
                                                <xsl:copy-of select="@*[not(name() = 'rowspan')]"/>
                                                <xsl:copy-of select="node()"/>
                                        </xsl:copy>
                                </xsl:when>
                                <xsl:otherwise>
                                        <xsl:copy-of select="$currentRow/td[1 + count(current()/preceding-sibling::td[not(@rowspan) or (@rowspan = 1)])]"/>
                                </xsl:otherwise>
                        </xsl:choose>
                </xsl:for-each>
        </xsl:variable>

        <xsl:variable name="newRow">
                <xsl:copy>
                        <xsl:copy-of select="$currentRow/@*"/>
                        <xsl:copy-of select="xalan:nodeset($normalizedTDs)"/>
                </xsl:copy>
        </xsl:variable>
        <xsl:copy-of select="$newRow"/>

        <xsl:apply-templates select="following-sibling::tr[1]" mode="simple-table-rowspan">
                <xsl:with-param name="previousRow" select="$newRow"/>
        </xsl:apply-templates>
    </xsl:template>
    <!-- End mode simple-table-rowspan  -->

    <!-- Step 3: add id for each cell -->
    <!-- mode: simple-table-id -->
    <xsl:template match="/" mode="simple-table-id">
        <xsl:param name="id"/>
        <xsl:variable name="id_prefixed" select="concat('table_if_',$id)"/> <!-- table id prefixed by 'table_if_' to simple search in IF  -->
        <xsl:apply-templates select="@*|node()" mode="simple-table-id">
            <xsl:with-param name="id" select="$id_prefixed"/>
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="@*|node()" mode="simple-table-id">
        <xsl:param name="id"/>
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="simple-table-id">
                    <xsl:with-param name="id" select="$id"/>
                </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name()='tbody']" mode="simple-table-id">
        <xsl:param name="id"/>
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
            <xsl:apply-templates select="node()" mode="simple-table-id">
                <xsl:with-param name="id" select="$id"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name()='th' or local-name()='td']" mode="simple-table-id">
        <xsl:param name="id"/>
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:variable name="row_number" select="count(../preceding-sibling::*) + 1"/>
            <xsl:variable name="col_number" select="count(preceding-sibling::*) + 1"/>
            <xsl:variable name="divide">
                <xsl:choose>
                    <xsl:when test="@divide"><xsl:value-of select="@divide"/></xsl:when>
                    <xsl:otherwise>1</xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            <xsl:attribute name="id">
                <xsl:value-of select="concat($id,'_',$row_number,'_',$col_number,'_',$divide)"/>
            </xsl:attribute>

            <xsl:for-each select="*[local-name() = 'p']">
                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                    <xsl:variable name="p_num" select="count(preceding-sibling::*[local-name() = 'p']) + 1"/>
                    <xsl:attribute name="id">
                        <xsl:value-of select="concat($id,'_',$row_number,'_',$col_number,'_p_',$p_num,'_',$divide)"/>
                    </xsl:attribute>

                    <!-- <xsl:copy-of select="node()" /> -->
                    <xsl:apply-templates mode="simple-table-noid"/>

                </xsl:copy>
            </xsl:for-each>

            <xsl:if test="$isGenerateTableIF = 'true'"> <!-- split each paragraph to words, image, math -->

                <xsl:variable name="td_text">
                    <xsl:apply-templates select="." mode="td_text_with_formatting"/>
                </xsl:variable>

                <!-- td_text='<xsl:copy-of select="$td_text"/>' -->

                <xsl:variable name="words">
                    <xsl:for-each select=".//*[local-name() = 'image' or local-name() = 'stem']">
                        <word>
                            <xsl:copy-of select="."/>
                        </word>
                    </xsl:for-each>

                    <xsl:for-each select="xalan:nodeset($td_text)//*[local-name() = 'word'][normalize-space() != '']">
                        <xsl:copy-of select="."/>
                    </xsl:for-each>

                </xsl:variable>

                <xsl:for-each select="xalan:nodeset($words)/word">
                    <xsl:variable name="num" select="count(preceding-sibling::word) + 1"/>
                    <xsl:copy>
                        <xsl:attribute name="id">
                            <xsl:value-of select="concat($id,'_',$row_number,'_',$col_number,'_word_',$num,'_',$divide)"/>
                        </xsl:attribute>
                        <xsl:copy-of select="node()"/>
                    </xsl:copy>
                </xsl:for-each>
            </xsl:if>
        </xsl:copy>

    </xsl:template>

    <xsl:template match="*[local-name()='th' or local-name()='td']/*[local-name() = 'p']//*" mode="simple-table-noid">
        <xsl:copy>
            <xsl:choose>
                <xsl:when test="$isGenerateTableIF = 'true'">
                    <xsl:copy-of select="@*[local-name() != 'id']"/> <!-- to prevent repeat id in colspan/rowspan cells -->
                    <!-- <xsl:if test="local-name() = 'dl' or local-name() = 'table'">
                        <xsl:copy-of select="@id"/>
                    </xsl:if> -->
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="@*"/>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:apply-templates select="node()" mode="simple-table-noid"/>
        </xsl:copy>
    </xsl:template>

    <!-- End mode: simple-table-id -->
    <!-- ===================== -->
    <!-- ===================== -->

    <!-- =============================== -->
    <!-- mode="td_text_with_formatting" -->
    <!-- =============================== -->
    <xsl:template match="@*|node()" mode="td_text_with_formatting">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="td_text_with_formatting"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'stem' or local-name() = 'image']" mode="td_text_with_formatting"/>

    <xsl:template match="*[local-name() = 'keep-together_within-line']/text()" mode="td_text_with_formatting">
        <xsl:variable name="formatting_tags">
            <xsl:call-template name="getFormattingTags"/>
        </xsl:variable>
        <word>
            <xsl:call-template name="enclose_text_in_tags">
                <xsl:with-param name="text" select="normalize-space(.)"/>
                <xsl:with-param name="tags" select="$formatting_tags"/>
            </xsl:call-template>
        </word>
    </xsl:template>

    <xsl:template match="*[local-name() != 'keep-together_within-line']/text()" mode="td_text_with_formatting">

        <xsl:variable name="td_text" select="."/>

        <xsl:variable name="string_with_added_zerospaces">
            <xsl:call-template name="add-zero-spaces-java">
                <xsl:with-param name="text" select="$td_text"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:variable name="formatting_tags">
            <xsl:call-template name="getFormattingTags"/>
        </xsl:variable>

        <!-- <word>text</word> -->
        <xsl:call-template name="tokenize_with_tags">
            <xsl:with-param name="tags" select="$formatting_tags"/>
            <xsl:with-param name="text" select="normalize-space(translate($string_with_added_zerospaces, '​­', '  '))"/> <!-- replace zero-width-space and soft-hyphen to space -->
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="getFormattingTags">
        <tags>
            <xsl:if test="ancestor::*[local-name() = 'strong']"><tag>strong</tag></xsl:if>
            <xsl:if test="ancestor::*[local-name() = 'em']"><tag>em</tag></xsl:if>
            <xsl:if test="ancestor::*[local-name() = 'sub']"><tag>sub</tag></xsl:if>
            <xsl:if test="ancestor::*[local-name() = 'sup']"><tag>sup</tag></xsl:if>
            <xsl:if test="ancestor::*[local-name() = 'tt']"><tag>tt</tag></xsl:if>
            <xsl:if test="ancestor::*[local-name() = 'keep-together_within-line']"><tag>keep-together_within-line</tag></xsl:if>
        </tags>
    </xsl:template>
    <!-- =============================== -->
    <!-- END mode="td_text_with_formatting" -->
    <!-- =============================== -->

    <xsl:template name="getLang">
        <xsl:variable name="language_current" select="normalize-space(//*[local-name()='bibdata']//*[local-name()='language'][@current = 'true'])"/>
        <xsl:variable name="language">
            <xsl:choose>
                <xsl:when test="$language_current != ''">
                    <xsl:value-of select="$language_current"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:variable name="language_current_2" select="normalize-space(xalan:nodeset($bibdata)//*[local-name()='bibdata']//*[local-name()='language'][@current = 'true'])"/>
                    <xsl:choose>
                        <xsl:when test="$language_current_2 != ''">
                            <xsl:value-of select="$language_current_2"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="//*[local-name()='bibdata']//*[local-name()='language']"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:choose>
            <xsl:when test="$language = 'English'">en</xsl:when>
            <xsl:otherwise><xsl:value-of select="$language"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="capitalizeWords">
        <xsl:param name="str"/>
        <xsl:variable name="str2" select="translate($str, '-', ' ')"/>
        <xsl:choose>
            <xsl:when test="contains($str2, ' ')">
                <xsl:variable name="substr" select="substring-before($str2, ' ')"/>
                <xsl:call-template name="capitalize">
                    <xsl:with-param name="str" select="$substr"/>
                </xsl:call-template>
                <xsl:text> </xsl:text>
                <xsl:call-template name="capitalizeWords">
                    <xsl:with-param name="str" select="substring-after($str2, ' ')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="capitalize">
                    <xsl:with-param name="str" select="$str2"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="capitalize">
        <xsl:param name="str"/>
        <xsl:value-of select="java:toUpperCase(java:java.lang.String.new(substring($str, 1, 1)))"/>
        <xsl:value-of select="substring($str, 2)"/>
    </xsl:template>

    <xsl:template match="mathml:math">
        <xsl:variable name="isAdded" select="@added"/>
        <xsl:variable name="isDeleted" select="@deleted"/>

        <fo:inline xsl:use-attribute-sets="mathml-style">

            <xsl:if test="$isGenerateTableIF = 'true' and ancestor::*[local-name() = 'td' or local-name() = 'th' or local-name() = 'dl'] and not(following-sibling::node()[not(self::comment())][normalize-space() != ''])"> <!-- math in table cell, and math is last element -->
                <!-- <xsl:attribute name="padding-right">1mm</xsl:attribute> -->
            </xsl:if>

            <xsl:call-template name="setTrackChangesStyles">
                <xsl:with-param name="isAdded" select="$isAdded"/>
                <xsl:with-param name="isDeleted" select="$isDeleted"/>
            </xsl:call-template>

            <xsl:if test="$add_math_as_text = 'true'">
                <!-- insert helper tag -->
                <!-- set unique font-size (fiction) -->
                <xsl:variable name="font-size_sfx"><xsl:number level="any"/></xsl:variable>
                <fo:inline color="white" font-size="1.{$font-size_sfx}pt" font-style="normal" font-weight="normal"><xsl:value-of select="$zero_width_space"/></fo:inline> <!-- zero width space -->
            </xsl:if>

            <xsl:variable name="mathml_content">
                <xsl:apply-templates select="." mode="mathml_actual_text"/>
            </xsl:variable>

                    <xsl:call-template name="mathml_instream_object">
                        <xsl:with-param name="mathml_content" select="$mathml_content"/>
                    </xsl:call-template>

        </fo:inline>
    </xsl:template>

    <xsl:template name="getMathml_comment_text">
        <xsl:variable name="comment_text_following" select="following-sibling::node()[1][self::comment()]"/>
        <xsl:variable name="comment_text_">
            <xsl:choose>
                <xsl:when test="normalize-space($comment_text_following) != ''">
                    <xsl:value-of select="$comment_text_following"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="normalize-space(translate(.,' ⁢','  '))"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="comment_text_2" select="java:org.metanorma.fop.Util.unescape($comment_text_)"/>
        <xsl:variable name="comment_text" select="java:trim(java:java.lang.String.new($comment_text_2))"/>
        <xsl:value-of select="$comment_text"/>
    </xsl:template>

    <xsl:template name="mathml_instream_object">
        <xsl:param name="comment_text"/>
        <xsl:param name="mathml_content"/>

        <xsl:variable name="comment_text_">
            <xsl:choose>
                <xsl:when test="normalize-space($comment_text) != ''"><xsl:value-of select="$comment_text"/></xsl:when>
                <xsl:otherwise><xsl:call-template name="getMathml_comment_text"/></xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="mathml">
            <xsl:apply-templates select="." mode="mathml"/>
        </xsl:variable>

        <fo:instream-foreign-object fox:alt-text="Math">

            <!-- put MathML in Actual Text -->
            <!-- DEBUG: mathml_content=<xsl:value-of select="$mathml_content"/> -->
            <xsl:attribute name="fox:actual-text">
                <xsl:value-of select="$mathml_content"/>
            </xsl:attribute>

            <!-- <xsl:if test="$add_math_as_text = 'true'"> -->
            <xsl:if test="normalize-space($comment_text_) != ''">
            <!-- put Mathin Alternate Text -->
                <xsl:attribute name="fox:alt-text">
                    <xsl:value-of select="$comment_text_"/>
                </xsl:attribute>
            </xsl:if>
            <!-- </xsl:if> -->

            <xsl:copy-of select="xalan:nodeset($mathml)"/>

        </fo:instream-foreign-object>
    </xsl:template>

    <xsl:template match="mathml:*" mode="mathml_actual_text">
        <!-- <xsl:text>a+b</xsl:text> -->
        <xsl:text>&lt;</xsl:text>
        <xsl:value-of select="local-name()"/>
        <xsl:if test="local-name() = 'math'">
            <xsl:text> xmlns="http://www.w3.org/1998/Math/MathML"</xsl:text>
        </xsl:if>
        <xsl:for-each select="@*">
            <xsl:text> </xsl:text>
            <xsl:value-of select="local-name()"/>
            <xsl:text>="</xsl:text>
            <xsl:value-of select="."/>
            <xsl:text>"</xsl:text>
        </xsl:for-each>
        <xsl:text>&gt;</xsl:text>
        <xsl:apply-templates mode="mathml_actual_text"/>
        <xsl:text>&lt;/</xsl:text>
        <xsl:value-of select="local-name()"/>
        <xsl:text>&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="text()" mode="mathml_actual_text">
        <xsl:value-of select="normalize-space()"/>
    </xsl:template>

    <xsl:template match="@*|node()" mode="mathml">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="mathml"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="mathml:mtext" mode="mathml">
        <xsl:copy>
            <!-- replace start and end spaces to non-break space -->
            <xsl:value-of select="java:replaceAll(java:java.lang.String.new(.),'(^ )|( $)',' ')"/>
        </xsl:copy>
    </xsl:template>

    <!-- <xsl:template match="mathml:mi[. = ',' and not(following-sibling::*[1][local-name() = 'mtext' and text() = '&#xa0;'])]" mode="mathml">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="mathml"/>
        </xsl:copy>
        <xsl:choose>
            if in msub, then don't add space
            <xsl:when test="ancestor::mathml:mrow[parent::mathml:msub and preceding-sibling::*[1][self::mathml:mrow]]"></xsl:when>
            if next char in digit,  don't add space
            <xsl:when test="translate(substring(following-sibling::*[1]/text(),1,1),'0123456789','') = ''"></xsl:when>
            <xsl:otherwise>
                <mathml:mspace width="0.5ex"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> -->

    <xsl:template match="mathml:math/*[local-name()='unit']" mode="mathml"/>
    <xsl:template match="mathml:math/*[local-name()='prefix']" mode="mathml"/>
    <xsl:template match="mathml:math/*[local-name()='dimension']" mode="mathml"/>
    <xsl:template match="mathml:math/*[local-name()='quantity']" mode="mathml"/>

    <!-- patch: slash in the mtd wrong rendering -->
    <xsl:template match="mathml:mtd/mathml:mo/text()[. = '/']" mode="mathml">
        <xsl:value-of select="."/><xsl:value-of select="$zero_width_space"/>
    </xsl:template>

    <xsl:template match="*[local-name()='localityStack']"/>

    <xsl:template match="*[local-name()='link']" name="link">
        <xsl:variable name="target">
            <xsl:choose>
                <xsl:when test="@updatetype = 'true'">
                    <xsl:value-of select="concat(normalize-space(@target), '.pdf')"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="normalize-space(@target)"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="target_text">
            <xsl:choose>
                <xsl:when test="starts-with(normalize-space(@target), 'mailto:')">
                    <xsl:value-of select="normalize-space(substring-after(@target, 'mailto:'))"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="normalize-space(@target)"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <fo:inline xsl:use-attribute-sets="link-style">

            <xsl:if test="starts-with(normalize-space(@target), 'mailto:')">
                <xsl:attribute name="keep-together.within-line">always</xsl:attribute>
            </xsl:if>

            <xsl:choose>
                <xsl:when test="$target_text = ''">
                    <xsl:apply-templates/>
                </xsl:when>
                <xsl:otherwise>
                    <fo:basic-link external-destination="{$target}" fox:alt-text="{$target}">
                        <xsl:choose>
                            <xsl:when test="normalize-space(.) = ''">
                                <xsl:call-template name="add-zero-spaces-link-java">
                                    <xsl:with-param name="text" select="$target_text"/>
                                </xsl:call-template>
                            </xsl:when>
                            <xsl:otherwise>
                                <!-- output text from <link>text</link> -->
                                <xsl:apply-templates/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </fo:basic-link>
                </xsl:otherwise>
            </xsl:choose>
        </fo:inline>
    </xsl:template> <!-- link -->

    <!-- ======================== -->
    <!-- Appendix processing -->
    <!-- ======================== -->
    <xsl:template match="*[local-name()='appendix']">
        <fo:block id="{@id}" xsl:use-attribute-sets="appendix-style">
            <xsl:apply-templates select="*[local-name()='title']"/>
        </fo:block>
        <xsl:apply-templates select="node()[not(local-name()='title')]"/>
    </xsl:template>

    <xsl:template match="*[local-name()='appendix']/*[local-name()='title']" priority="2">
        <xsl:variable name="level">
            <xsl:call-template name="getLevel"/>
        </xsl:variable>
        <fo:inline role="H{$level}"><xsl:apply-templates/></fo:inline>
    </xsl:template>
    <!-- ======================== -->
    <!-- END Appendix processing -->
    <!-- ======================== -->

    <xsl:template match="*[local-name()='appendix']//*[local-name()='example']" priority="2">
        <fo:block id="{@id}" xsl:use-attribute-sets="appendix-example-style">
            <xsl:apply-templates select="*[local-name()='name']"/>
        </fo:block>
        <xsl:apply-templates select="node()[not(local-name()='name')]"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'callout']">
        <fo:basic-link internal-destination="{@target}" fox:alt-text="{@target}">&lt;<xsl:apply-templates/>&gt;</fo:basic-link>
    </xsl:template>

    <xsl:template match="*[local-name() = 'annotation']">
        <xsl:variable name="annotation-id" select="@id"/>
        <xsl:variable name="callout" select="//*[@target = $annotation-id]/text()"/>
        <fo:block id="{$annotation-id}" white-space="nowrap">
            <fo:inline>
                <xsl:apply-templates>
                    <xsl:with-param name="callout" select="concat('&lt;', $callout, '&gt; ')"/>
                </xsl:apply-templates>
            </fo:inline>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'annotation']/*[local-name() = 'p']">
        <xsl:param name="callout"/>
        <fo:inline id="{@id}">
            <!-- for first p in annotation, put <x> -->
            <xsl:if test="not(preceding-sibling::*[local-name() = 'p'])"><xsl:value-of select="$callout"/></xsl:if>
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'xref']">
        <fo:basic-link internal-destination="{@target}" fox:alt-text="{@target}" xsl:use-attribute-sets="xref-style">
            <xsl:if test="parent::*[local-name() = 'add']">
                <xsl:call-template name="append_add-style"/>
            </xsl:if>
            <xsl:apply-templates/>
        </fo:basic-link>
    </xsl:template>

    <!-- ====== -->
    <!-- formula  -->
    <!-- ====== -->
    <xsl:template match="*[local-name() = 'formula']" name="formula">
        <fo:block-container margin-left="0mm">
            <xsl:if test="parent::*[local-name() = 'note']">
                <xsl:attribute name="margin-left">
                    <xsl:choose>
                        <xsl:when test="not(ancestor::*[local-name() = 'table'])"><xsl:value-of select="$note-body-indent"/></xsl:when>
                        <xsl:otherwise><xsl:value-of select="$note-body-indent-table"/></xsl:otherwise>
                    </xsl:choose>
                </xsl:attribute>

                    <xsl:attribute name="margin-left">0mm</xsl:attribute>

            </xsl:if>
            <fo:block-container margin-left="0mm">
                <fo:block id="{@id}">
                    <xsl:apply-templates select="node()[not(local-name() = 'name')]"/> <!-- formula's number will be process in 'stem' template -->
                </fo:block>
            </fo:block-container>
        </fo:block-container>
    </xsl:template>

    <xsl:template match="*[local-name() = 'formula']/*[local-name() = 'dt']/*[local-name() = 'stem']">
        <fo:inline>
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'admitted']/*[local-name() = 'stem']">
        <fo:inline>
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'formula']/*[local-name() = 'name']"> <!-- show in 'stem' template -->
        <xsl:if test="normalize-space() != ''">
            <xsl:text>(</xsl:text><xsl:apply-templates/><xsl:text>)</xsl:text>
        </xsl:if>
    </xsl:template>

    <!-- stem inside formula with name (with formula's number) -->
    <xsl:template match="*[local-name() = 'formula'][*[local-name() = 'name']]/*[local-name() = 'stem']">
        <fo:block xsl:use-attribute-sets="formula-style">

                <xsl:if test="not(ancestor::*[local-name()='note'])">
                    <xsl:attribute name="font-size">11pt</xsl:attribute>
                </xsl:if>

            <fo:table table-layout="fixed" width="100%">
                <fo:table-column column-width="95%"/>
                <fo:table-column column-width="5%"/>
                <fo:table-body>
                    <fo:table-row>
                        <fo:table-cell display-align="center">
                            <fo:block xsl:use-attribute-sets="formula-stem-block-style">

                                <xsl:apply-templates/>
                            </fo:block>
                        </fo:table-cell>
                        <fo:table-cell display-align="center">
                            <fo:block xsl:use-attribute-sets="formula-stem-number-style">
                                <xsl:apply-templates select="../*[local-name() = 'name']"/>
                            </fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>
        </fo:block>
    </xsl:template>

    <!-- stem inside formula without name (without formula's number) -->
    <xsl:template match="*[local-name() = 'formula'][not(*[local-name() = 'name'])]/*[local-name() = 'stem']">
        <fo:block xsl:use-attribute-sets="formula-style">
            <fo:block xsl:use-attribute-sets="formula-stem-block-style">
                <xsl:apply-templates/>
            </fo:block>
        </fo:block>
    </xsl:template>

    <!-- ====== -->
    <!-- ====== -->

    <!-- ====== -->
    <!-- note      -->
    <!-- termnote -->
    <!-- ====== -->

    <xsl:template match="*[local-name() = 'note']" name="note">

        <fo:block-container id="{@id}" xsl:use-attribute-sets="note-style">

            <fo:block-container margin-left="0mm">

                        <fo:table table-layout="fixed" width="100%">
                            <fo:table-column column-width="10mm"/>
                            <fo:table-column column-width="155mm"/>
                            <fo:table-body>
                                <fo:table-row>
                                    <fo:table-cell>
                                        <fo:block font-family="SimHei" xsl:use-attribute-sets="note-name-style">
                                            <xsl:apply-templates select="gb:name"/>
                                        </fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell>
                                        <fo:block text-align="justify">
                                            <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
                                        </fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                            </fo:table-body>
                        </fo:table>
                        <!-- gb -->

            </fo:block-container>
        </fo:block-container>

    </xsl:template>

    <xsl:template match="*[local-name() = 'note']/*[local-name() = 'p']">
        <xsl:variable name="num"><xsl:number/></xsl:variable>
        <xsl:choose>
            <xsl:when test="$num = 1"> <!-- display first NOTE's paragraph in the same line with label NOTE -->
                <fo:inline xsl:use-attribute-sets="note-p-style">
                    <xsl:apply-templates/>
                </fo:inline>
            </xsl:when>
            <xsl:otherwise>
                <fo:block xsl:use-attribute-sets="note-p-style">
                    <xsl:apply-templates/>
                </fo:block>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="*[local-name() = 'termnote']">
        <fo:block id="{@id}" xsl:use-attribute-sets="termnote-style">

            <fo:inline xsl:use-attribute-sets="termnote-name-style">

                <xsl:if test="not(*[local-name() = 'name']/following-sibling::node()[1][self::text()][normalize-space()=''])">
                    <xsl:attribute name="padding-right">1mm</xsl:attribute>
                </xsl:if>

                <!-- if 'p' contains all text in 'add' first and last elements in first p are 'add' -->
                <!-- <xsl:if test="*[not(local-name()='name')][1][node()[normalize-space() != ''][1][local-name() = 'add'] and node()[normalize-space() != ''][last()][local-name() = 'add']]"> -->
                <xsl:if test="*[not(local-name()='name')][1][count(node()[normalize-space() != '']) = 1 and *[local-name() = 'add']]">
                    <xsl:call-template name="append_add-style"/>
                </xsl:if>

                <xsl:apply-templates select="*[local-name() = 'name']"/>

            </fo:inline>

            <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'note']/*[local-name() = 'name']">
        <xsl:param name="sfx"/>
        <xsl:variable name="suffix">
            <xsl:choose>
                <xsl:when test="$sfx != ''">
                    <xsl:value-of select="$sfx"/>
                </xsl:when>
                <xsl:otherwise>

                        <xsl:text>:</xsl:text>

                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:if test="normalize-space() != ''">
            <xsl:apply-templates/>
            <xsl:value-of select="$suffix"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'termnote']/*[local-name() = 'name']">
        <xsl:param name="sfx"/>
        <xsl:variable name="suffix">
            <xsl:choose>
                <xsl:when test="$sfx != ''">
                    <xsl:value-of select="$sfx"/>
                </xsl:when>
                <xsl:otherwise>

                        <xsl:text>:</xsl:text>

                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:if test="normalize-space() != ''">
            <xsl:apply-templates/>
            <xsl:value-of select="$suffix"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'termnote']/*[local-name() = 'p']">
        <xsl:variable name="num"><xsl:number/></xsl:variable>
        <xsl:choose>
            <xsl:when test="$num = 1"> <!-- first paragraph renders in the same line as titlenote name -->
                <fo:inline xsl:use-attribute-sets="termnote-p-style">
                    <xsl:apply-templates/>
                </fo:inline>
            </xsl:when>
            <xsl:otherwise>
                <fo:block xsl:use-attribute-sets="termnote-p-style">
                    <xsl:apply-templates/>
                </fo:block>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- ====== -->
    <!-- ====== -->

    <!-- ====== -->
    <!-- term      -->
    <!-- ====== -->

    <xsl:template match="*[local-name() = 'terms']">
        <!-- <xsl:message>'terms' <xsl:number/> processing...</xsl:message> -->
        <fo:block id="{@id}">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'term']">
        <fo:block id="{@id}" xsl:use-attribute-sets="term-style">

                <fo:block font-family="SimHei" font-size="11pt" keep-with-next="always" margin-top="10pt" margin-bottom="8pt" line-height="1.1">
                    <xsl:apply-templates select="gb:name"/>
                </fo:block>

            <xsl:if test="parent::*[local-name() = 'term'] and not(preceding-sibling::*[local-name() = 'term'])">

            </xsl:if>
            <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'term']/*[local-name() = 'name']">
        <xsl:if test="normalize-space() != ''">
            <xsl:variable name="level">
                <xsl:call-template name="getLevelTermName"/>
            </xsl:variable>
            <fo:inline role="H{$level}">
                <xsl:apply-templates/>
            </fo:inline>
        </xsl:if>
    </xsl:template>
    <!-- ====== -->
    <!-- ====== -->

    <!-- ====== -->
    <!-- figure    -->
    <!-- image    -->
    <!-- ====== -->

    <xsl:template match="*[local-name() = 'figure']" name="figure">
        <xsl:variable name="isAdded" select="@added"/>
        <xsl:variable name="isDeleted" select="@deleted"/>
        <fo:block-container id="{@id}">

            <xsl:call-template name="setTrackChangesStyles">
                <xsl:with-param name="isAdded" select="$isAdded"/>
                <xsl:with-param name="isDeleted" select="$isDeleted"/>
            </xsl:call-template>

            <fo:block xsl:use-attribute-sets="figure-style">
                <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
            </fo:block>
            <xsl:call-template name="fn_display_figure"/>
            <xsl:for-each select="*[local-name() = 'note']">
                <xsl:call-template name="note"/>
            </xsl:for-each>

                    <xsl:apply-templates select="*[local-name() = 'name']"/> <!-- show figure's name AFTER image -->

        </fo:block-container>
    </xsl:template>

    <xsl:template match="*[local-name() = 'figure'][@class = 'pseudocode']">
        <fo:block id="{@id}">
            <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
        </fo:block>
        <xsl:apply-templates select="*[local-name() = 'name']"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'figure'][@class = 'pseudocode']//*[local-name() = 'p']">
        <fo:block xsl:use-attribute-sets="figure-pseudocode-p-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'image']">
        <xsl:variable name="isAdded" select="../@added"/>
        <xsl:variable name="isDeleted" select="../@deleted"/>
        <xsl:choose>
            <xsl:when test="ancestor::*[local-name() = 'title']">
                <fo:inline padding-left="1mm" padding-right="1mm">
                    <xsl:variable name="src">
                        <xsl:call-template name="image_src"/>
                    </xsl:variable>
                    <fo:external-graphic src="{$src}" fox:alt-text="Image {@alt}" vertical-align="middle"/>
                </fo:inline>
            </xsl:when>
            <xsl:otherwise>
                <fo:block xsl:use-attribute-sets="image-style">

                    <xsl:variable name="src">
                        <xsl:call-template name="image_src"/>
                    </xsl:variable>

                    <xsl:choose>
                        <xsl:when test="$isDeleted = 'true'">
                            <!-- enclose in svg -->
                            <fo:instream-foreign-object fox:alt-text="Image {@alt}">
                                <xsl:attribute name="width">100%</xsl:attribute>
                                <xsl:attribute name="content-height">100%</xsl:attribute>
                                <xsl:attribute name="content-width">scale-down-to-fit</xsl:attribute>
                                <xsl:attribute name="scaling">uniform</xsl:attribute>

                                    <xsl:apply-templates select="." mode="cross_image"/>

                            </fo:instream-foreign-object>
                        </xsl:when>
                        <xsl:otherwise>
                            <fo:external-graphic src="{$src}" fox:alt-text="Image {@alt}" xsl:use-attribute-sets="image-graphic-style">
                                <xsl:if test="not(@mimetype = 'image/svg+xml') and ../*[local-name() = 'name'] and not(ancestor::*[local-name() = 'table'])">

                                    <xsl:variable name="img_src">
                                        <xsl:choose>
                                            <xsl:when test="not(starts-with(@src, 'data:'))"><xsl:value-of select="concat($basepath, @src)"/></xsl:when>
                                            <xsl:otherwise><xsl:value-of select="@src"/></xsl:otherwise>
                                        </xsl:choose>
                                    </xsl:variable>

                                    <xsl:variable name="scale" select="java:org.metanorma.fop.Util.getImageScale($img_src, $width_effective, $height_effective)"/>
                                    <xsl:if test="number($scale) &lt; 100">
                                        <xsl:attribute name="content-width"><xsl:value-of select="$scale"/>%</xsl:attribute>
                                    </xsl:if>

                                </xsl:if>

                            </fo:external-graphic>
                        </xsl:otherwise>
                    </xsl:choose>

                </fo:block>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="image_src">
        <xsl:choose>
            <xsl:when test="@mimetype = 'image/svg+xml' and $images/images/image[@id = current()/@id]">
                <xsl:value-of select="$images/images/image[@id = current()/@id]/@src"/>
            </xsl:when>
            <xsl:when test="not(starts-with(@src, 'data:'))">
                <xsl:value-of select="concat('url(file:',$basepath, @src, ')')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@src"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="*[local-name() = 'image']" mode="cross_image">
        <xsl:choose>
            <xsl:when test="@mimetype = 'image/svg+xml' and $images/images/image[@id = current()/@id]">
                <xsl:variable name="src">
                    <xsl:value-of select="$images/images/image[@id = current()/@id]/@src"/>
                </xsl:variable>
                <xsl:variable name="width" select="document($src)/@width"/>
                <xsl:variable name="height" select="document($src)/@height"/>
                <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="enable-background:new 0 0 595.28 841.89;" height="{$height}" width="{$width}" viewBox="0 0 {$width} {$height}" y="0px" x="0px" id="Layer_1" version="1.1">
                    <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="{$src}" style="overflow:visible;"/>
                </svg>
            </xsl:when>
            <xsl:when test="not(starts-with(@src, 'data:'))">
                <xsl:variable name="src">
                    <xsl:value-of select="concat('url(file:',$basepath, @src, ')')"/>
                </xsl:variable>
                <xsl:variable name="file" select="java:java.io.File.new(@src)"/>
                <xsl:variable name="bufferedImage" select="java:javax.imageio.ImageIO.read($file)"/>
                <xsl:variable name="width" select="java:getWidth($bufferedImage)"/>
                <xsl:variable name="height" select="java:getHeight($bufferedImage)"/>
                <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="enable-background:new 0 0 595.28 841.89;" height="{$height}" width="{$width}" viewBox="0 0 {$width} {$height}" y="0px" x="0px" id="Layer_1" version="1.1">
                    <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="{$src}" style="overflow:visible;"/>
                </svg>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="base64String" select="substring-after(@src, 'base64,')"/>
                <xsl:variable name="decoder" select="java:java.util.Base64.getDecoder()"/>
                <xsl:variable name="fileContent" select="java:decode($decoder, $base64String)"/>
                <xsl:variable name="bis" select="java:java.io.ByteArrayInputStream.new($fileContent)"/>
                <xsl:variable name="bufferedImage" select="java:javax.imageio.ImageIO.read($bis)"/>
                <xsl:variable name="width" select="java:getWidth($bufferedImage)"/>
                <xsl:variable name="height" select="java:getHeight($bufferedImage)"/>
                <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="enable-background:new 0 0 595.28 841.89;" height="{$height}" width="{$width}" viewBox="0 0 {$width} {$height}" y="0px" x="0px" id="Layer_1" version="1.1">
                    <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="{@src}" height="{$height}" width="{$width}" style="overflow:visible;"/>
                    <xsl:call-template name="svg_cross">
                        <xsl:with-param name="width" select="$width"/>
                        <xsl:with-param name="height" select="$height"/>
                    </xsl:call-template>
                </svg>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>

    <xsl:template name="svg_cross">
        <xsl:param name="width"/>
        <xsl:param name="height"/>
        <line xmlns="http://www.w3.org/2000/svg" x1="0" y1="0" x2="{$width}" y2="{$height}" style="stroke: rgb(255, 0, 0); stroke-width:4px; "/>
        <line xmlns="http://www.w3.org/2000/svg" x1="0" y1="{$height}" x2="{$width}" y2="0" style="stroke: rgb(255, 0, 0); stroke-width:4px; "/>
    </xsl:template>

    <!-- =================== -->
    <!-- SVG images processing -->
    <!-- =================== -->
    <xsl:variable name="figure_name_height">14</xsl:variable>
    <xsl:variable name="width_effective" select="$pageWidth - $marginLeftRight1 - $marginLeftRight2"/><!-- paper width minus margins -->
    <xsl:variable name="height_effective" select="$pageHeight - $marginTop - $marginBottom - $figure_name_height"/><!-- paper height minus margins and title height -->
    <xsl:variable name="image_dpi" select="96"/>
    <xsl:variable name="width_effective_px" select="$width_effective div 25.4 * $image_dpi"/>
    <xsl:variable name="height_effective_px" select="$height_effective div 25.4 * $image_dpi"/>

    <xsl:template match="*[local-name() = 'figure'][not(*[local-name() = 'image']) and *[local-name() = 'svg']]/*[local-name() = 'name']/*[local-name() = 'bookmark']" priority="2"/>
    <xsl:template match="*[local-name() = 'figure'][not(*[local-name() = 'image'])]/*[local-name() = 'svg']" priority="2" name="image_svg">
        <xsl:param name="name"/>

        <xsl:variable name="svg_content">
            <xsl:apply-templates select="." mode="svg_update"/>
        </xsl:variable>

        <xsl:variable name="alt-text">
            <xsl:choose>
                <xsl:when test="normalize-space(../*[local-name() = 'name']) != ''">
                    <xsl:value-of select="../*[local-name() = 'name']"/>
                </xsl:when>
                <xsl:when test="normalize-space($name) != ''">
                    <xsl:value-of select="$name"/>
                </xsl:when>
                <xsl:otherwise>Figure</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:choose>
            <xsl:when test=".//*[local-name() = 'a'][*[local-name() = 'rect'] or *[local-name() = 'polygon'] or *[local-name() = 'circle'] or *[local-name() = 'ellipse']]">
                <fo:block>
                    <xsl:variable name="width" select="@width"/>
                    <xsl:variable name="height" select="@height"/>

                    <xsl:variable name="scale_x">
                        <xsl:choose>
                            <xsl:when test="$width &gt; $width_effective_px">
                                <xsl:value-of select="$width_effective_px div $width"/>
                            </xsl:when>
                            <xsl:otherwise>1</xsl:otherwise>
                        </xsl:choose>
                    </xsl:variable>

                    <xsl:variable name="scale_y">
                        <xsl:choose>
                            <xsl:when test="$height * $scale_x &gt; $height_effective_px">
                                <xsl:value-of select="$height_effective_px div ($height * $scale_x)"/>
                            </xsl:when>
                            <xsl:otherwise>1</xsl:otherwise>
                        </xsl:choose>
                    </xsl:variable>

                    <xsl:variable name="scale">
                        <xsl:choose>
                            <xsl:when test="$scale_y != 1">
                                <xsl:value-of select="$scale_x * $scale_y"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="$scale_x"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:variable>

                    <xsl:variable name="width_scale" select="round($width * $scale)"/>
                    <xsl:variable name="height_scale" select="round($height * $scale)"/>

                    <fo:table table-layout="fixed" width="100%">
                        <fo:table-column column-width="proportional-column-width(1)"/>
                        <fo:table-column column-width="{$width_scale}px"/>
                        <fo:table-column column-width="proportional-column-width(1)"/>
                        <fo:table-body>
                            <fo:table-row>
                                <fo:table-cell column-number="2">
                                    <fo:block>
                                        <fo:block-container width="{$width_scale}px" height="{$height_scale}px">
                                            <xsl:if test="../*[local-name() = 'name']/*[local-name() = 'bookmark']">
                                                <fo:block line-height="0" font-size="0">
                                                    <xsl:for-each select="../*[local-name() = 'name']/*[local-name() = 'bookmark']">
                                                        <xsl:call-template name="bookmark"/>
                                                    </xsl:for-each>
                                                </fo:block>
                                            </xsl:if>
                                            <fo:block text-depth="0" line-height="0" font-size="0">

                                                <fo:instream-foreign-object fox:alt-text="{$alt-text}">
                                                    <xsl:attribute name="width">100%</xsl:attribute>
                                                    <xsl:attribute name="content-height">100%</xsl:attribute>
                                                    <xsl:attribute name="content-width">scale-down-to-fit</xsl:attribute>
                                                    <xsl:attribute name="scaling">uniform</xsl:attribute>

                                                    <xsl:apply-templates select="xalan:nodeset($svg_content)" mode="svg_remove_a"/>
                                                </fo:instream-foreign-object>
                                            </fo:block>

                                            <xsl:apply-templates select=".//*[local-name() = 'a'][*[local-name() = 'rect'] or *[local-name() = 'polygon'] or *[local-name() = 'circle'] or *[local-name() = 'ellipse']]" mode="svg_imagemap_links">
                                                <xsl:with-param name="scale" select="$scale"/>
                                            </xsl:apply-templates>
                                        </fo:block-container>
                                    </fo:block>
                                </fo:table-cell>
                            </fo:table-row>
                        </fo:table-body>
                    </fo:table>
                </fo:block>

            </xsl:when>
            <xsl:otherwise>
                <fo:block xsl:use-attribute-sets="image-style">
                    <fo:instream-foreign-object fox:alt-text="{$alt-text}">
                        <xsl:attribute name="width">100%</xsl:attribute>
                        <xsl:attribute name="content-height">100%</xsl:attribute>
                        <xsl:attribute name="content-width">scale-down-to-fit</xsl:attribute>
                        <xsl:variable name="svg_width" select="xalan:nodeset($svg_content)/*/@width"/>
                        <xsl:variable name="svg_height" select="xalan:nodeset($svg_content)/*/@height"/>
                        <!-- effective height 297 - 27.4 - 13 =  256.6 -->
                        <!-- effective width 210 - 12.5 - 25 = 172.5 -->
                        <!-- effective height / width = 1.48, 1.4 - with title -->
                        <xsl:if test="$svg_height &gt; ($svg_width * 1.4)"> <!-- for images with big height -->
                            <xsl:variable name="width" select="(($svg_width * 1.4) div $svg_height) * 100"/>
                            <xsl:attribute name="width"><xsl:value-of select="$width"/>%</xsl:attribute>
                        </xsl:if>
                        <xsl:attribute name="scaling">uniform</xsl:attribute>
                        <xsl:copy-of select="$svg_content"/>
                    </fo:instream-foreign-object>
                </fo:block>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- ============== -->
    <!-- svg_update     -->
    <!-- ============== -->
    <xsl:template match="@*|node()" mode="svg_update">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="svg_update"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'image']/@href" mode="svg_update">
        <xsl:attribute name="href" namespace="http://www.w3.org/1999/xlink">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="*[local-name() = 'svg'][not(@width and @height)]" mode="svg_update">
        <xsl:copy>
            <xsl:apply-templates select="@*" mode="svg_update"/>
            <xsl:variable name="viewbox_">
                <xsl:call-template name="split">
                    <xsl:with-param name="pText" select="@viewBox"/>
                    <xsl:with-param name="sep" select="' '"/>
                </xsl:call-template>
            </xsl:variable>
            <xsl:variable name="viewbox" select="xalan:nodeset($viewbox_)"/>
            <xsl:variable name="width" select="normalize-space($viewbox//item[3])"/>
            <xsl:variable name="height" select="normalize-space($viewbox//item[4])"/>

            <xsl:attribute name="width">
                <xsl:choose>
                    <xsl:when test="$width != ''">
                        <xsl:value-of select="round($width)"/>
                    </xsl:when>
                    <xsl:otherwise>400</xsl:otherwise> <!-- default width -->
                </xsl:choose>
            </xsl:attribute>
            <xsl:attribute name="height">
                <xsl:choose>
                    <xsl:when test="$height != ''">
                        <xsl:value-of select="round($height)"/>
                    </xsl:when>
                    <xsl:otherwise>400</xsl:otherwise> <!-- default height -->
                </xsl:choose>
            </xsl:attribute>

            <xsl:apply-templates mode="svg_update"/>
        </xsl:copy>
    </xsl:template>
    <!-- ============== -->
    <!-- END: svg_update -->
    <!-- ============== -->

    <!-- image with svg and emf -->
    <xsl:template match="*[local-name() = 'figure']/*[local-name() = 'image'][*[local-name() = 'svg']]" priority="3">
        <xsl:variable name="name" select="ancestor::*[local-name() = 'figure']/*[local-name() = 'name']"/>
        <xsl:for-each select="*[local-name() = 'svg']">
            <xsl:call-template name="image_svg">
                <xsl:with-param name="name" select="$name"/>
            </xsl:call-template>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="*[local-name() = 'figure']/*[local-name() = 'image'][@mimetype = 'image/svg+xml' and @src[not(starts-with(., 'data:image/'))]]" priority="2">
        <xsl:variable name="svg_content" select="document(@src)"/>
        <xsl:variable name="name" select="ancestor::*[local-name() = 'figure']/*[local-name() = 'name']"/>
        <xsl:for-each select="xalan:nodeset($svg_content)/node()">
            <xsl:call-template name="image_svg">
                <xsl:with-param name="name" select="$name"/>
            </xsl:call-template>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="@*|node()" mode="svg_remove_a">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="svg_remove_a"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'a']" mode="svg_remove_a">
        <xsl:apply-templates mode="svg_remove_a"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'a']" mode="svg_imagemap_links">
        <xsl:param name="scale"/>
        <xsl:variable name="dest">
            <xsl:choose>
                <xsl:when test="starts-with(@href, '#')">
                    <xsl:value-of select="substring-after(@href, '#')"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="@href"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:for-each select="./*[local-name() = 'rect']">
            <xsl:call-template name="insertSVGMapLink">
                <xsl:with-param name="left" select="floor(@x * $scale)"/>
                <xsl:with-param name="top" select="floor(@y * $scale)"/>
                <xsl:with-param name="width" select="floor(@width * $scale)"/>
                <xsl:with-param name="height" select="floor(@height * $scale)"/>
                <xsl:with-param name="dest" select="$dest"/>
            </xsl:call-template>
        </xsl:for-each>

        <xsl:for-each select="./*[local-name() = 'polygon']">
            <xsl:variable name="points">
                <xsl:call-template name="split">
                    <xsl:with-param name="pText" select="@points"/>
                </xsl:call-template>
            </xsl:variable>
            <xsl:variable name="x_coords">
                <xsl:for-each select="xalan:nodeset($points)//item[position() mod 2 = 1]">
                    <xsl:sort select="." data-type="number"/>
                    <x><xsl:value-of select="."/></x>
                </xsl:for-each>
            </xsl:variable>
            <xsl:variable name="y_coords">
                <xsl:for-each select="xalan:nodeset($points)//item[position() mod 2 = 0]">
                    <xsl:sort select="." data-type="number"/>
                    <y><xsl:value-of select="."/></y>
                </xsl:for-each>
            </xsl:variable>
            <xsl:variable name="x" select="xalan:nodeset($x_coords)//x[1]"/>
            <xsl:variable name="y" select="xalan:nodeset($y_coords)//y[1]"/>
            <xsl:variable name="width" select="xalan:nodeset($x_coords)//x[last()] - $x"/>
            <xsl:variable name="height" select="xalan:nodeset($y_coords)//y[last()] - $y"/>
            <xsl:call-template name="insertSVGMapLink">
                <xsl:with-param name="left" select="floor($x * $scale)"/>
                <xsl:with-param name="top" select="floor($y * $scale)"/>
                <xsl:with-param name="width" select="floor($width * $scale)"/>
                <xsl:with-param name="height" select="floor($height * $scale)"/>
                <xsl:with-param name="dest" select="$dest"/>
            </xsl:call-template>
        </xsl:for-each>

        <xsl:for-each select="./*[local-name() = 'circle']">
            <xsl:call-template name="insertSVGMapLink">
                <xsl:with-param name="left" select="floor((@cx - @r) * $scale)"/>
                <xsl:with-param name="top" select="floor((@cy - @r) * $scale)"/>
                <xsl:with-param name="width" select="floor(@r * 2 * $scale)"/>
                <xsl:with-param name="height" select="floor(@r * 2 * $scale)"/>
                <xsl:with-param name="dest" select="$dest"/>
            </xsl:call-template>
        </xsl:for-each>
        <xsl:for-each select="./*[local-name() = 'ellipse']">
            <xsl:call-template name="insertSVGMapLink">
                <xsl:with-param name="left" select="floor((@cx - @rx) * $scale)"/>
                <xsl:with-param name="top" select="floor((@cy - @ry) * $scale)"/>
                <xsl:with-param name="width" select="floor(@rx * 2 * $scale)"/>
                <xsl:with-param name="height" select="floor(@ry * 2 * $scale)"/>
                <xsl:with-param name="dest" select="$dest"/>
            </xsl:call-template>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="insertSVGMapLink">
        <xsl:param name="left"/>
        <xsl:param name="top"/>
        <xsl:param name="width"/>
        <xsl:param name="height"/>
        <xsl:param name="dest"/>
        <fo:block-container position="absolute" left="{$left}px" top="{$top}px" width="{$width}px" height="{$height}px">
         <fo:block font-size="1pt">
            <fo:basic-link internal-destination="{$dest}" fox:alt-text="svg link">
                <fo:inline-container inline-progression-dimension="100%">
                    <fo:block-container height="{$height - 1}px" width="100%">
                        <!-- DEBUG <xsl:if test="local-name()='polygon'">
                            <xsl:attribute name="background-color">magenta</xsl:attribute>
                        </xsl:if> -->
                    <fo:block> </fo:block></fo:block-container>
                </fo:inline-container>
            </fo:basic-link>
         </fo:block>
      </fo:block-container>
    </xsl:template>
    <!-- =================== -->
    <!-- End SVG images processing -->
    <!-- =================== -->

    <!-- ignore emf processing (Apache FOP doesn't support EMF) -->
    <xsl:template match="*[local-name() = 'emf']"/>

    <xsl:template match="*[local-name() = 'figure']/*[local-name() = 'name'] |                *[local-name() = 'table']/*[local-name() = 'name'] |               *[local-name() = 'permission']/*[local-name() = 'name'] |               *[local-name() = 'recommendation']/*[local-name() = 'name'] |               *[local-name() = 'requirement']/*[local-name() = 'name']" mode="contents">
        <xsl:apply-templates mode="contents"/>
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="*[local-name() = 'figure']/*[local-name() = 'name'] |                *[local-name() = 'table']/*[local-name() = 'name'] |               *[local-name() = 'permission']/*[local-name() = 'name'] |               *[local-name() = 'recommendation']/*[local-name() = 'name'] |               *[local-name() = 'requirement']/*[local-name() = 'name'] |               *[local-name() = 'sourcecode']/*[local-name() = 'name']" mode="bookmarks">
        <xsl:apply-templates mode="bookmarks"/>
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="*[local-name() = 'figure' or local-name() = 'table' or local-name() = 'permission' or local-name() = 'recommendation' or local-name() = 'requirement']/*[local-name() = 'name']/text()" mode="contents" priority="2">
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'figure' or local-name() = 'table' or local-name() = 'permission' or local-name() = 'recommendation' or local-name() = 'requirement' or local-name() = 'sourcecode']/*[local-name() = 'name']//text()" mode="bookmarks" priority="2">
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="node()" mode="contents">
        <xsl:apply-templates mode="contents"/>
    </xsl:template>

    <!-- special case: ignore preface/section-title and sections/section-title without @displayorder  -->
    <xsl:template match="*[local-name() = 'preface' or local-name() = 'sections']/*[local-name() = 'p'][@type = 'section-title' and not(@displayorder)]" priority="3" mode="contents"/>
    <!-- process them by demand (mode="contents_no_displayorder") -->
    <xsl:template match="*[local-name() = 'p'][@type = 'section-title' and not(@displayorder)]" mode="contents_no_displayorder">
        <xsl:call-template name="contents_section-title"/>
    </xsl:template>
    <xsl:template match="*[local-name() = 'p'][@type = 'section-title']" mode="contents_in_clause">
        <xsl:call-template name="contents_section-title"/>
    </xsl:template>

    <!-- special case: ignore section-title if @depth different than @depth of parent clause, or @depth of parent clause = 1 -->
    <xsl:template match="*[local-name() = 'clause']/*[local-name() = 'p'][@type = 'section-title' and (@depth != ../*[local-name() = 'title']/@depth or ../*[local-name() = 'title']/@depth = 1)]" priority="3" mode="contents"/>

    <xsl:template match="*[local-name() = 'p'][@type = 'floating-title' or @type = 'section-title']" priority="2" name="contents_section-title" mode="contents">
        <xsl:variable name="level">
            <xsl:call-template name="getLevel">
                <xsl:with-param name="depth" select="@depth"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:variable name="section">
            <xsl:choose>
                <xsl:when test="@type = 'section-title'"/>
                <xsl:otherwise>
                    <xsl:value-of select="*[local-name() = 'tab'][1]/preceding-sibling::node()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="type"><xsl:value-of select="@type"/></xsl:variable>

        <xsl:variable name="display">
            <xsl:choose>
                <xsl:when test="normalize-space(@id) = ''">false</xsl:when>
                <xsl:when test="$level &lt;= $toc_level">true</xsl:when>
                <xsl:otherwise>false</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="skip">false</xsl:variable>

        <xsl:if test="$skip = 'false'">

            <xsl:variable name="title">
                <xsl:choose>
                    <xsl:when test="*[local-name() = 'tab']">
                        <xsl:choose>
                            <xsl:when test="@type = 'section-title'">
                                <xsl:value-of select="*[local-name() = 'tab'][1]/preceding-sibling::node()"/>
                                <xsl:text>: </xsl:text>
                                <xsl:copy-of select="*[local-name() = 'tab'][1]/following-sibling::node()"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:copy-of select="*[local-name() = 'tab'][1]/following-sibling::node()"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:copy-of select="node()"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>

            <xsl:variable name="root">
                <xsl:if test="ancestor-or-self::*[local-name() = 'preface']">preface</xsl:if>
                <xsl:if test="ancestor-or-self::*[local-name() = 'annex']">annex</xsl:if>
            </xsl:variable>

            <item id="{@id}" level="{$level}" section="{$section}" type="{$type}" root="{$root}" display="{$display}">
                <title>
                    <xsl:apply-templates select="xalan:nodeset($title)" mode="contents_item"/>
                </title>
            </item>
        </xsl:if>
    </xsl:template>

    <xsl:template match="node()" mode="bookmarks">
        <xsl:apply-templates mode="bookmarks"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'title' or local-name() = 'name']//*[local-name() = 'stem']" mode="contents">
        <xsl:apply-templates select="."/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'references'][@hidden='true']" mode="contents" priority="3"/>

    <xsl:template match="*[local-name() = 'references']/*[local-name() = 'bibitem']" mode="contents"/>

    <!-- Note: to enable the addition of character span markup with semantic styling for DIS Word output -->
    <xsl:template match="*[local-name() = 'span']" mode="contents">
        <xsl:apply-templates mode="contents"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'stem']" mode="bookmarks">
        <xsl:apply-templates mode="bookmarks"/>
    </xsl:template>

    <!-- Note: to enable the addition of character span markup with semantic styling for DIS Word output -->
    <xsl:template match="*[local-name() = 'span']" mode="bookmarks">
        <xsl:apply-templates mode="bookmarks"/>
    </xsl:template>

    <!-- Bookmarks -->
    <xsl:template name="addBookmarks">
        <xsl:param name="contents"/>
        <xsl:variable name="contents_nodes" select="xalan:nodeset($contents)"/>
        <xsl:if test="$contents_nodes//item">
            <fo:bookmark-tree>
                <xsl:choose>
                    <xsl:when test="$contents_nodes/doc">
                        <xsl:choose>
                            <xsl:when test="count($contents_nodes/doc) &gt; 1">
                                <xsl:for-each select="$contents_nodes/doc">
                                    <fo:bookmark internal-destination="{contents/item[1]/@id}" starting-state="hide">
                                        <xsl:if test="@bundle = 'true'">
                                            <xsl:attribute name="internal-destination"><xsl:value-of select="@firstpage_id"/></xsl:attribute>
                                        </xsl:if>
                                        <fo:bookmark-title>
                                            <xsl:choose>
                                                <xsl:when test="not(normalize-space(@bundle) = 'true')"> <!-- 'bundle' means several different documents (not language versions) in one xml -->
                                                    <xsl:variable name="bookmark-title_">
                                                        <xsl:call-template name="getLangVersion">
                                                            <xsl:with-param name="lang" select="@lang"/>
                                                            <xsl:with-param name="doctype" select="@doctype"/>
                                                            <xsl:with-param name="title" select="@title-part"/>
                                                        </xsl:call-template>
                                                    </xsl:variable>
                                                    <xsl:choose>
                                                        <xsl:when test="normalize-space($bookmark-title_) != ''">
                                                            <xsl:value-of select="normalize-space($bookmark-title_)"/>
                                                        </xsl:when>
                                                        <xsl:otherwise>
                                                            <xsl:choose>
                                                                <xsl:when test="@lang = 'en'">English</xsl:when>
                                                                <xsl:when test="@lang = 'fr'">Français</xsl:when>
                                                                <xsl:when test="@lang = 'de'">Deutsche</xsl:when>
                                                                <xsl:otherwise><xsl:value-of select="@lang"/> version</xsl:otherwise>
                                                            </xsl:choose>
                                                        </xsl:otherwise>
                                                    </xsl:choose>
                                                </xsl:when>
                                                <xsl:otherwise>
                                                    <xsl:value-of select="@title-part"/>
                                                </xsl:otherwise>
                                            </xsl:choose>
                                        </fo:bookmark-title>

                                        <xsl:apply-templates select="contents/item" mode="bookmark"/>

                                        <xsl:call-template name="insertFigureBookmarks">
                                            <xsl:with-param name="contents" select="contents"/>
                                        </xsl:call-template>

                                        <xsl:call-template name="insertTableBookmarks">
                                            <xsl:with-param name="contents" select="contents"/>
                                            <xsl:with-param name="lang" select="@lang"/>
                                        </xsl:call-template>

                                    </fo:bookmark>

                                </xsl:for-each>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:for-each select="$contents_nodes/doc">

                                    <xsl:apply-templates select="contents/item" mode="bookmark"/>

                                    <xsl:call-template name="insertFigureBookmarks">
                                        <xsl:with-param name="contents" select="contents"/>
                                    </xsl:call-template>

                                    <xsl:call-template name="insertTableBookmarks">
                                        <xsl:with-param name="contents" select="contents"/>
                                        <xsl:with-param name="lang" select="@lang"/>
                                    </xsl:call-template>

                                </xsl:for-each>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="$contents_nodes/contents/item" mode="bookmark"/>

                        <xsl:call-template name="insertFigureBookmarks">
                            <xsl:with-param name="contents" select="$contents_nodes/contents"/>
                        </xsl:call-template>

                        <xsl:call-template name="insertTableBookmarks">
                            <xsl:with-param name="contents" select="$contents_nodes/contents"/>
                            <xsl:with-param name="lang" select="@lang"/>
                        </xsl:call-template>

                    </xsl:otherwise>
                </xsl:choose>

            </fo:bookmark-tree>
        </xsl:if>
    </xsl:template>

    <xsl:template name="insertFigureBookmarks">
        <xsl:param name="contents"/>
        <xsl:variable name="contents_nodes" select="xalan:nodeset($contents)"/>
        <xsl:if test="$contents_nodes/figure">
            <fo:bookmark internal-destination="{$contents_nodes/figure[1]/@id}" starting-state="hide">
                <fo:bookmark-title>Figures</fo:bookmark-title>
                <xsl:for-each select="$contents_nodes/figure">
                    <fo:bookmark internal-destination="{@id}">
                        <fo:bookmark-title>
                            <xsl:value-of select="normalize-space(title)"/>
                        </fo:bookmark-title>
                    </fo:bookmark>
                </xsl:for-each>
            </fo:bookmark>
        </xsl:if>

                <xsl:if test="$contents_nodes//figures/figure">
                    <fo:bookmark internal-destination="empty_bookmark" starting-state="hide">

                        <xsl:variable name="bookmark-title">

                                    <xsl:value-of select="$title-list-figures"/>

                        </xsl:variable>
                        <fo:bookmark-title><xsl:value-of select="normalize-space($bookmark-title)"/></fo:bookmark-title>
                        <xsl:for-each select="$contents_nodes//figures/figure">
                            <fo:bookmark internal-destination="{@id}">
                                <fo:bookmark-title><xsl:value-of select="normalize-space(.)"/></fo:bookmark-title>
                            </fo:bookmark>
                        </xsl:for-each>
                    </fo:bookmark>
                </xsl:if>

    </xsl:template> <!-- insertFigureBookmarks -->

    <xsl:template name="insertTableBookmarks">
        <xsl:param name="contents"/>
        <xsl:param name="lang"/>
        <xsl:variable name="contents_nodes" select="xalan:nodeset($contents)"/>
        <xsl:if test="$contents_nodes/table">
            <fo:bookmark internal-destination="{$contents_nodes/table[1]/@id}" starting-state="hide">
                <fo:bookmark-title>
                    <xsl:choose>
                        <xsl:when test="$lang = 'fr'">Tableaux</xsl:when>
                        <xsl:otherwise>Tables</xsl:otherwise>
                    </xsl:choose>
                </fo:bookmark-title>
                <xsl:for-each select="$contents_nodes/table">
                    <fo:bookmark internal-destination="{@id}">
                        <fo:bookmark-title>
                            <xsl:value-of select="normalize-space(title)"/>
                        </fo:bookmark-title>
                    </fo:bookmark>
                </xsl:for-each>
            </fo:bookmark>
        </xsl:if>

                <xsl:if test="$contents_nodes//tables/table">
                    <fo:bookmark internal-destination="empty_bookmark" starting-state="hide">

                        <xsl:variable name="bookmark-title">

                                    <xsl:value-of select="$title-list-tables"/>

                        </xsl:variable>

                        <fo:bookmark-title><xsl:value-of select="$bookmark-title"/></fo:bookmark-title>

                        <xsl:for-each select="$contents_nodes//tables/table">
                            <fo:bookmark internal-destination="{@id}">
                                <fo:bookmark-title><xsl:value-of select="normalize-space(.)"/></fo:bookmark-title>
                            </fo:bookmark>
                        </xsl:for-each>
                    </fo:bookmark>
                </xsl:if>

    </xsl:template> <!-- insertTableBookmarks -->
    <!-- End Bookmarks -->

    <xsl:template name="getLangVersion">
        <xsl:param name="lang"/>
        <xsl:param name="doctype" select="''"/>
        <xsl:param name="title" select="''"/>
        <xsl:choose>
            <xsl:when test="$lang = 'en'">

                </xsl:when>
            <xsl:when test="$lang = 'fr'">

            </xsl:when>
            <xsl:when test="$lang = 'de'">Deutsche</xsl:when>
            <xsl:otherwise><xsl:value-of select="$lang"/> version</xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="item" mode="bookmark">
        <xsl:choose>
            <xsl:when test="@id != ''">
                <fo:bookmark internal-destination="{@id}" starting-state="hide">
                    <fo:bookmark-title>
                        <xsl:if test="@section != ''">
                            <xsl:value-of select="@section"/>
                            <xsl:text> </xsl:text>
                        </xsl:if>
                        <xsl:value-of select="normalize-space(title)"/>
                    </fo:bookmark-title>
                    <xsl:apply-templates mode="bookmark"/>
                </fo:bookmark>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates mode="bookmark"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="title" mode="bookmark"/>
    <xsl:template match="text()" mode="bookmark"/>

    <xsl:template match="*[local-name() = 'figure']/*[local-name() = 'name'] |         *[local-name() = 'image']/*[local-name() = 'name']">
        <xsl:if test="normalize-space() != ''">
            <fo:block xsl:use-attribute-sets="figure-name-style">

                <xsl:apply-templates/>
            </fo:block>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'figure']/*[local-name() = 'fn']" priority="2"/>
    <xsl:template match="*[local-name() = 'figure']/*[local-name() = 'note']"/>

    <!-- ====== -->
    <!-- ====== -->
    <xsl:template match="*[local-name() = 'title']" mode="contents_item">
        <xsl:param name="mode">bookmarks</xsl:param>
        <xsl:apply-templates mode="contents_item">
            <xsl:with-param name="mode" select="$mode"/>
        </xsl:apply-templates>
        <!-- <xsl:text> </xsl:text> -->
    </xsl:template>

    <xsl:template name="getSection">
        <xsl:value-of select="*[local-name() = 'title']/*[local-name() = 'tab'][1]/preceding-sibling::node()"/>
    </xsl:template>

    <xsl:template name="getName">
        <xsl:choose>
            <xsl:when test="*[local-name() = 'title']/*[local-name() = 'tab']">
                <xsl:copy-of select="*[local-name() = 'title']/*[local-name() = 'tab'][1]/following-sibling::node()"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="*[local-name() = 'title']/node()"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="insertTitleAsListItem">
        <xsl:param name="provisional-distance-between-starts" select="'9.5mm'"/>
        <xsl:variable name="section">
            <xsl:for-each select="..">
                <xsl:call-template name="getSection"/>
            </xsl:for-each>
        </xsl:variable>
        <fo:list-block provisional-distance-between-starts="{$provisional-distance-between-starts}">
            <fo:list-item>
                <fo:list-item-label end-indent="label-end()">
                    <fo:block>
                        <xsl:value-of select="$section"/>
                    </fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="body-start()">
                    <fo:block>
                        <xsl:choose>
                            <xsl:when test="*[local-name() = 'tab']">
                                <xsl:apply-templates select="*[local-name() = 'tab'][1]/following-sibling::node()"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:apply-templates/>
                                <xsl:apply-templates select="following-sibling::*[1][local-name() = 'variant-title'][@type = 'sub']" mode="subtitle"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </fo:block>
                </fo:list-item-body>
            </fo:list-item>
        </fo:list-block>
    </xsl:template>

    <xsl:template name="extractSection">
        <xsl:value-of select="*[local-name() = 'tab'][1]/preceding-sibling::node()"/>
    </xsl:template>

    <xsl:template name="extractTitle">
        <xsl:choose>
                <xsl:when test="*[local-name() = 'tab']">
                    <xsl:apply-templates select="*[local-name() = 'tab'][1]/following-sibling::node()"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates/>
                </xsl:otherwise>
            </xsl:choose>
    </xsl:template>

    <xsl:template match="*[local-name() = 'fn']" mode="contents"/>
    <xsl:template match="*[local-name() = 'fn']" mode="bookmarks"/>

    <xsl:template match="*[local-name() = 'fn']" mode="contents_item"/>

    <xsl:template match="*[local-name() = 'xref'] | *[local-name() = 'eref']" mode="contents">
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'review']" mode="contents_item"/>

    <xsl:template match="*[local-name() = 'tab']" mode="contents_item">
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="*[local-name() = 'strong']" mode="contents_item">
        <xsl:copy>
            <xsl:apply-templates mode="contents_item"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'em']" mode="contents_item">
        <xsl:copy>
            <xsl:apply-templates mode="contents_item"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'sub']" mode="contents_item">
        <xsl:copy>
            <xsl:apply-templates mode="contents_item"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'sup']" mode="contents_item">
        <xsl:copy>
            <xsl:apply-templates mode="contents_item"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'stem']" mode="contents_item">
        <xsl:copy-of select="."/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'br']" mode="contents_item">
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="*[local-name() = 'name']" mode="contents_item">
        <xsl:param name="mode">bookmarks</xsl:param>
        <xsl:apply-templates mode="contents_item">
            <xsl:with-param name="mode" select="$mode"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="*[local-name() = 'add']" mode="contents_item">
        <xsl:param name="mode">bookmarks</xsl:param>
        <xsl:choose>
            <xsl:when test="starts-with(text(), $ace_tag)">
                <xsl:if test="$mode = 'contents'">
                    <xsl:copy>
                        <xsl:apply-templates mode="contents_item"/>
                    </xsl:copy>
                </xsl:if>
            </xsl:when>
            <xsl:otherwise><xsl:apply-templates mode="contents_item"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="text()" mode="contents_item">
        <xsl:call-template name="keep_together_standard_number"/>
    </xsl:template>

    <!-- Note: to enable the addition of character span markup with semantic styling for DIS Word output -->
    <xsl:template match="*[local-name() = 'span']" mode="contents_item">
        <xsl:apply-templates mode="contents_item"/>
    </xsl:template>

    <!-- ====== -->
    <!-- sourcecode   -->
    <!-- ====== -->
    <xsl:template match="*[local-name()='sourcecode']" name="sourcecode">

        <fo:block-container xsl:use-attribute-sets="sourcecode-container-style">

            <xsl:if test="not(ancestor::*[local-name() = 'li']) or ancestor::*[local-name() = 'example']">
                <xsl:attribute name="margin-left">0mm</xsl:attribute>
            </xsl:if>

            <xsl:if test="ancestor::*[local-name() = 'example']">
                <xsl:attribute name="margin-right">0mm</xsl:attribute>
            </xsl:if>

            <xsl:copy-of select="@id"/>

            <xsl:if test="parent::*[local-name() = 'note']">
                <xsl:attribute name="margin-left">
                    <xsl:choose>
                        <xsl:when test="not(ancestor::*[local-name() = 'table'])"><xsl:value-of select="$note-body-indent"/></xsl:when>
                        <xsl:otherwise><xsl:value-of select="$note-body-indent-table"/></xsl:otherwise>
                    </xsl:choose>
                </xsl:attribute>

                    <xsl:attribute name="margin-left">0mm</xsl:attribute>

            </xsl:if>
            <fo:block-container margin-left="0mm">

                <fo:block xsl:use-attribute-sets="sourcecode-style">
                    <xsl:variable name="_font-size">

                        9


                        <!-- 9 -->

                        <!-- <xsl:if test="$namespace = 'ieee'">                            
                            <xsl:if test="$current_template = 'standard'">8</xsl:if>
                        </xsl:if> -->

                </xsl:variable>

                <xsl:variable name="font-size" select="normalize-space($_font-size)"/>
                <xsl:if test="$font-size != ''">
                    <xsl:attribute name="font-size">
                        <xsl:choose>
                            <xsl:when test="$font-size = 'inherit'"><xsl:value-of select="$font-size"/></xsl:when>
                            <xsl:when test="contains($font-size, '%')"><xsl:value-of select="$font-size"/></xsl:when>
                            <xsl:when test="ancestor::*[local-name()='note']"><xsl:value-of select="$font-size * 0.91"/>pt</xsl:when>
                            <xsl:otherwise><xsl:value-of select="$font-size"/>pt</xsl:otherwise>
                        </xsl:choose>
                    </xsl:attribute>
                </xsl:if>

                <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
            </fo:block>

                    <xsl:apply-templates select="*[local-name()='name']"/> <!-- show sourcecode's name AFTER content -->

            </fo:block-container>
        </fo:block-container>
    </xsl:template>

    <xsl:template match="*[local-name()='sourcecode']/text()" priority="2">
        <xsl:choose>
            <xsl:when test="normalize-space($syntax-highlight) = 'true' and normalize-space(../@lang) != ''"> <!-- condition for turn on of highlighting -->
                <xsl:variable name="syntax" select="java:org.metanorma.fop.Util.syntaxHighlight(., ../@lang)"/>
                <xsl:choose>
                    <xsl:when test="normalize-space($syntax) != ''"><!-- if there is highlighted result -->
                        <xsl:apply-templates select="xalan:nodeset($syntax)" mode="syntax_highlight"/> <!-- process span tags -->
                    </xsl:when>
                    <xsl:otherwise> <!-- if case of non-succesfull syntax highlight (for instance, unknown lang), process without highlighting -->
                        <xsl:call-template name="add_spaces_to_sourcecode"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="add_spaces_to_sourcecode"/>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>

    <xsl:template name="add_spaces_to_sourcecode">
        <xsl:variable name="text_step1">
            <xsl:call-template name="add-zero-spaces-equal"/>
        </xsl:variable>
        <xsl:variable name="text_step2">
            <xsl:call-template name="add-zero-spaces-java">
                <xsl:with-param name="text" select="$text_step1"/>
            </xsl:call-template>
        </xsl:variable>

        <!-- <xsl:value-of select="$text_step2"/> -->

        <!-- add zero-width space after space -->
        <xsl:variable name="text_step3" select="java:replaceAll(java:java.lang.String.new($text_step2),' ',' ​')"/>

        <!-- split text by zero-width space -->
        <xsl:variable name="text_step4">
            <xsl:call-template name="split_for_interspers">
                <xsl:with-param name="pText" select="$text_step3"/>
                <xsl:with-param name="sep" select="$zero_width_space"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:for-each select="xalan:nodeset($text_step4)/node()">
            <xsl:choose>
                <xsl:when test="local-name() = 'interspers'"> <!-- word with length more than 30 will be interspersed with zero-width space -->
                    <xsl:call-template name="interspers-java">
                        <xsl:with-param name="str" select="."/>
                    </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>

    </xsl:template> <!-- add_spaces_to_sourcecode -->

    <xsl:variable name="interspers_tag_open">###interspers123###</xsl:variable>
    <xsl:variable name="interspers_tag_close">###/interspers123###</xsl:variable>
    <!-- split string by separator for interspers -->
    <xsl:template name="split_for_interspers">
        <xsl:param name="pText" select="."/>
        <xsl:param name="sep" select="','"/>
        <!-- word with length more than 30 will be interspersed with zero-width space -->
        <xsl:variable name="regex" select="concat('([^', $zero_width_space, ']{31,})')"/> <!-- sequence of characters (more 31), that doesn't contains zero-width space -->
        <xsl:variable name="text" select="java:replaceAll(java:java.lang.String.new($pText),$regex,concat($interspers_tag_open,'$1',$interspers_tag_close))"/>
        <xsl:call-template name="replace_tag_interspers">
            <xsl:with-param name="text" select="$text"/>
        </xsl:call-template>
    </xsl:template> <!-- end: split string by separator for interspers -->

    <xsl:template name="replace_tag_interspers">
        <xsl:param name="text"/>
        <xsl:choose>
            <xsl:when test="contains($text, $interspers_tag_open)">
                <xsl:value-of select="substring-before($text, $interspers_tag_open)"/>
                <xsl:variable name="text_after" select="substring-after($text, $interspers_tag_open)"/>
                <interspers>
                    <xsl:value-of select="substring-before($text_after, $interspers_tag_close)"/>
                </interspers>
                <xsl:call-template name="replace_tag_interspers">
                    <xsl:with-param name="text" select="substring-after($text_after, $interspers_tag_close)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise><xsl:value-of select="$text"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- insert 'char' between each character in the string -->
    <xsl:template name="interspers">
        <xsl:param name="str"/>
        <xsl:param name="char" select="$zero_width_space"/>
        <xsl:if test="$str != ''">
            <xsl:value-of select="substring($str, 1, 1)"/>

            <xsl:variable name="next_char" select="substring($str, 2, 1)"/>
            <xsl:if test="not(contains(concat(' -.:=_— ', $char), $next_char))">
                <xsl:value-of select="$char"/>
            </xsl:if>

            <xsl:call-template name="interspers">
                <xsl:with-param name="str" select="substring($str, 2)"/>
                <xsl:with-param name="char" select="$char"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template name="interspers-java">
        <xsl:param name="str"/>
        <xsl:param name="char" select="$zero_width_space"/>
        <xsl:value-of select="java:replaceAll(java:java.lang.String.new($str),'([^ -.:=_—])',concat('$1', $char))"/> <!-- insert $char after each char excep space, - . : = _ etc. -->
    </xsl:template>

    <xsl:template match="*" mode="syntax_highlight">
        <xsl:apply-templates mode="syntax_highlight"/>
    </xsl:template>

    <xsl:variable name="syntax_highlight_styles_">
        <style class="hljs-addition" xsl:use-attribute-sets="hljs-addition"/>
        <style class="hljs-attr" xsl:use-attribute-sets="hljs-attr"/>
        <style class="hljs-attribute" xsl:use-attribute-sets="hljs-attribute"/>
        <style class="hljs-built_in" xsl:use-attribute-sets="hljs-built_in"/>
        <style class="hljs-bullet" xsl:use-attribute-sets="hljs-bullet"/>
        <style class="hljs-char_and_escape_" xsl:use-attribute-sets="hljs-char_and_escape_"/>
        <style class="hljs-code" xsl:use-attribute-sets="hljs-code"/>
        <style class="hljs-comment" xsl:use-attribute-sets="hljs-comment"/>
        <style class="hljs-deletion" xsl:use-attribute-sets="hljs-deletion"/>
        <style class="hljs-doctag" xsl:use-attribute-sets="hljs-doctag"/>
        <style class="hljs-emphasis" xsl:use-attribute-sets="hljs-emphasis"/>
        <style class="hljs-formula" xsl:use-attribute-sets="hljs-formula"/>
        <style class="hljs-keyword" xsl:use-attribute-sets="hljs-keyword"/>
        <style class="hljs-link" xsl:use-attribute-sets="hljs-link"/>
        <style class="hljs-literal" xsl:use-attribute-sets="hljs-literal"/>
        <style class="hljs-meta" xsl:use-attribute-sets="hljs-meta"/>
        <style class="hljs-meta_hljs-string" xsl:use-attribute-sets="hljs-meta_hljs-string"/>
        <style class="hljs-meta_hljs-keyword" xsl:use-attribute-sets="hljs-meta_hljs-keyword"/>
        <style class="hljs-name" xsl:use-attribute-sets="hljs-name"/>
        <style class="hljs-number" xsl:use-attribute-sets="hljs-number"/>
        <style class="hljs-operator" xsl:use-attribute-sets="hljs-operator"/>
        <style class="hljs-params" xsl:use-attribute-sets="hljs-params"/>
        <style class="hljs-property" xsl:use-attribute-sets="hljs-property"/>
        <style class="hljs-punctuation" xsl:use-attribute-sets="hljs-punctuation"/>
        <style class="hljs-quote" xsl:use-attribute-sets="hljs-quote"/>
        <style class="hljs-regexp" xsl:use-attribute-sets="hljs-regexp"/>
        <style class="hljs-section" xsl:use-attribute-sets="hljs-section"/>
        <style class="hljs-selector-attr" xsl:use-attribute-sets="hljs-selector-attr"/>
        <style class="hljs-selector-class" xsl:use-attribute-sets="hljs-selector-class"/>
        <style class="hljs-selector-id" xsl:use-attribute-sets="hljs-selector-id"/>
        <style class="hljs-selector-pseudo" xsl:use-attribute-sets="hljs-selector-pseudo"/>
        <style class="hljs-selector-tag" xsl:use-attribute-sets="hljs-selector-tag"/>
        <style class="hljs-string" xsl:use-attribute-sets="hljs-string"/>
        <style class="hljs-strong" xsl:use-attribute-sets="hljs-strong"/>
        <style class="hljs-subst" xsl:use-attribute-sets="hljs-subst"/>
        <style class="hljs-symbol" xsl:use-attribute-sets="hljs-symbol"/>
        <style class="hljs-tag" xsl:use-attribute-sets="hljs-tag"/>
        <!-- <style class="hljs-tag_hljs-attr" xsl:use-attribute-sets="hljs-tag_hljs-attr"></style> -->
        <!-- <style class="hljs-tag_hljs-name" xsl:use-attribute-sets="hljs-tag_hljs-name"></style> -->
        <style class="hljs-template-tag" xsl:use-attribute-sets="hljs-template-tag"/>
        <style class="hljs-template-variable" xsl:use-attribute-sets="hljs-template-variable"/>
        <style class="hljs-title" xsl:use-attribute-sets="hljs-title"/>
        <style class="hljs-title_and_class_" xsl:use-attribute-sets="hljs-title_and_class_"/>
        <style class="hljs-title_and_class__and_inherited__" xsl:use-attribute-sets="hljs-title_and_class__and_inherited__"/>
        <style class="hljs-title_and_function_" xsl:use-attribute-sets="hljs-title_and_function_"/>
        <style class="hljs-type" xsl:use-attribute-sets="hljs-type"/>
        <style class="hljs-variable" xsl:use-attribute-sets="hljs-variable"/>
        <style class="hljs-variable_and_language_" xsl:use-attribute-sets="hljs-variable_and_language_"/>
    </xsl:variable>
    <xsl:variable name="syntax_highlight_styles" select="xalan:nodeset($syntax_highlight_styles_)"/>

    <xsl:template match="span" mode="syntax_highlight" priority="2">
        <!-- <fo:inline color="green" font-style="italic"><xsl:apply-templates mode="syntax_highlight"/></fo:inline> -->
        <fo:inline>
            <xsl:variable name="classes_">
                <xsl:call-template name="split">
                    <xsl:with-param name="pText" select="@class"/>
                    <xsl:with-param name="sep" select="' '"/>
                </xsl:call-template>
                <!-- a few classes together (_and_ suffix) -->
                <xsl:if test="contains(@class, 'hljs-char') and contains(@class, 'escape_')">
                    <item>hljs-char_and_escape_</item>
                </xsl:if>
                <xsl:if test="contains(@class, 'hljs-title') and contains(@class, 'class_')">
                    <item>hljs-title_and_class_</item>
                </xsl:if>
                <xsl:if test="contains(@class, 'hljs-title') and contains(@class, 'class_') and contains(@class, 'inherited__')">
                    <item>hljs-title_and_class__and_inherited__</item>
                </xsl:if>
                <xsl:if test="contains(@class, 'hljs-title') and contains(@class, 'function_')">
                    <item>hljs-title_and_function_</item>
                </xsl:if>
                <xsl:if test="contains(@class, 'hljs-variable') and contains(@class, 'language_')">
                    <item>hljs-variable_and_language_</item>
                </xsl:if>
                <!-- with parent classes (_ suffix) -->
                <xsl:if test="contains(@class, 'hljs-keyword') and contains(ancestor::*/@class, 'hljs-meta')">
                    <item>hljs-meta_hljs-keyword</item>
                </xsl:if>
                <xsl:if test="contains(@class, 'hljs-string') and contains(ancestor::*/@class, 'hljs-meta')">
                    <item>hljs-meta_hljs-string</item>
                </xsl:if>
            </xsl:variable>
            <xsl:variable name="classes" select="xalan:nodeset($classes_)"/>

            <xsl:for-each select="$classes/item">
                <xsl:variable name="class_name" select="."/>
                <xsl:for-each select="$syntax_highlight_styles/style[@class = $class_name]/@*[not(local-name() = 'class')]">
                    <xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>
                </xsl:for-each>
            </xsl:for-each>

            <!-- <xsl:variable name="class_name">
                <xsl:choose>
                    <xsl:when test="@class = 'hljs-attr' and ancestor::*/@class = 'hljs-tag'">hljs-tag_hljs-attr</xsl:when>
                    <xsl:when test="@class = 'hljs-name' and ancestor::*/@class = 'hljs-tag'">hljs-tag_hljs-name</xsl:when>
                    <xsl:when test="@class = 'hljs-string' and ancestor::*/@class = 'hljs-meta'">hljs-meta_hljs-string</xsl:when>
                    <xsl:otherwise><xsl:value-of select="@class"/></xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            <xsl:for-each select="$syntax_highlight_styles/style[@class = $class_name]/@*[not(local-name() = 'class')]">
                <xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>
            </xsl:for-each> -->

        <xsl:apply-templates mode="syntax_highlight"/></fo:inline>
    </xsl:template>

    <xsl:template match="text()" mode="syntax_highlight" priority="2">
        <xsl:call-template name="add_spaces_to_sourcecode"/>
    </xsl:template>

    <!-- end mode="syntax_highlight" -->

    <xsl:template match="*[local-name() = 'sourcecode']/*[local-name() = 'name']">
        <xsl:if test="normalize-space() != ''">
            <fo:block xsl:use-attribute-sets="sourcecode-name-style">
                <xsl:apply-templates/>
            </fo:block>
        </xsl:if>
    </xsl:template>
    <!-- ====== -->
    <!-- ====== -->

    <!-- ========== -->
    <!-- permission -->
    <!-- ========== -->
    <xsl:template match="*[local-name() = 'permission']">
        <fo:block id="{@id}" xsl:use-attribute-sets="permission-style">
            <xsl:apply-templates select="*[local-name()='name']"/>
            <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'permission']/*[local-name() = 'name']">
        <xsl:if test="normalize-space() != ''">
            <fo:block xsl:use-attribute-sets="permission-name-style">
                <xsl:apply-templates/>

            </fo:block>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'permission']/*[local-name() = 'label']">
        <fo:block xsl:use-attribute-sets="permission-label-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    <!-- ========== -->
    <!-- ========== -->

    <!-- ========== -->
    <!-- requirement -->
<!-- ========== -->
    <xsl:template match="*[local-name() = 'requirement']">
        <fo:block id="{@id}" xsl:use-attribute-sets="requirement-style">
            <xsl:apply-templates select="*[local-name()='name']"/>
            <xsl:apply-templates select="*[local-name()='label']"/>
            <xsl:apply-templates select="@obligation"/>
            <xsl:apply-templates select="*[local-name()='subject']"/>
            <xsl:apply-templates select="node()[not(local-name() = 'name') and not(local-name() = 'label') and not(local-name() = 'subject')]"/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'requirement']/*[local-name() = 'name']">
        <xsl:if test="normalize-space() != ''">
            <fo:block xsl:use-attribute-sets="requirement-name-style">

                <xsl:apply-templates/>

            </fo:block>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'requirement']/*[local-name() = 'label']">
        <fo:block xsl:use-attribute-sets="requirement-label-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'requirement']/@obligation">
            <fo:block>
                <fo:inline padding-right="3mm">Obligation</fo:inline><xsl:value-of select="."/>
            </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'requirement']/*[local-name() = 'subject']" priority="2">
        <fo:block xsl:use-attribute-sets="subject-style">
            <xsl:text>Target Type </xsl:text><xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <!-- ========== -->
    <!-- ========== -->

    <!-- ========== -->
    <!-- recommendation -->
    <!-- ========== -->
    <xsl:template match="*[local-name() = 'recommendation']">
        <fo:block id="{@id}" xsl:use-attribute-sets="recommendation-style">
            <xsl:apply-templates select="*[local-name()='name']"/>
            <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'recommendation']/*[local-name() = 'name']">
        <xsl:if test="normalize-space() != ''">
            <fo:block xsl:use-attribute-sets="recommendation-name-style">
                <xsl:apply-templates/>

            </fo:block>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'recommendation']/*[local-name() = 'label']">
        <fo:block xsl:use-attribute-sets="recommendation-label-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    <!-- ========== -->
    <!-- END recommendation -->
    <!-- ========== -->

    <!-- ========== -->
    <!-- ========== -->

    <xsl:template match="*[local-name() = 'subject']">
        <fo:block xsl:use-attribute-sets="subject-style">
            <xsl:text>Target Type </xsl:text><xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'inherit'] | *[local-name() = 'component'][@class = 'inherit'] |           *[local-name() = 'div'][@type = 'requirement-inherit'] |           *[local-name() = 'div'][@type = 'recommendation-inherit'] |           *[local-name() = 'div'][@type = 'permission-inherit']">
        <fo:block xsl:use-attribute-sets="inherit-style">
            <xsl:text>Dependency </xsl:text><xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'description'] | *[local-name() = 'component'][@class = 'description'] |           *[local-name() = 'div'][@type = 'requirement-description'] |           *[local-name() = 'div'][@type = 'recommendation-description'] |           *[local-name() = 'div'][@type = 'permission-description']">
        <fo:block xsl:use-attribute-sets="description-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'specification'] | *[local-name() = 'component'][@class = 'specification'] |           *[local-name() = 'div'][@type = 'requirement-specification'] |           *[local-name() = 'div'][@type = 'recommendation-specification'] |           *[local-name() = 'div'][@type = 'permission-specification']">
        <fo:block xsl:use-attribute-sets="specification-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'measurement-target'] | *[local-name() = 'component'][@class = 'measurement-target'] |           *[local-name() = 'div'][@type = 'requirement-measurement-target'] |           *[local-name() = 'div'][@type = 'recommendation-measurement-target'] |           *[local-name() = 'div'][@type = 'permission-measurement-target']">
        <fo:block xsl:use-attribute-sets="measurement-target-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'verification'] | *[local-name() = 'component'][@class = 'verification'] |           *[local-name() = 'div'][@type = 'requirement-verification'] |           *[local-name() = 'div'][@type = 'recommendation-verification'] |           *[local-name() = 'div'][@type = 'permission-verification']">
        <fo:block xsl:use-attribute-sets="verification-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'import'] | *[local-name() = 'component'][@class = 'import'] |           *[local-name() = 'div'][@type = 'requirement-import'] |           *[local-name() = 'div'][@type = 'recommendation-import'] |           *[local-name() = 'div'][@type = 'permission-import']">
        <fo:block xsl:use-attribute-sets="import-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'div'][starts-with(@type, 'requirement-component')] |           *[local-name() = 'div'][starts-with(@type, 'recommendation-component')] |           *[local-name() = 'div'][starts-with(@type, 'permission-component')]">
        <fo:block xsl:use-attribute-sets="component-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    <!-- ========== -->
    <!-- END  -->
    <!-- ========== -->

    <!-- ========== -->
    <!-- requirement, recommendation, permission table -->
    <!-- ========== -->
    <xsl:template match="*[local-name() = 'table'][@class = 'recommendation' or @class='requirement' or @class='permission']">
        <fo:block-container margin-left="0mm" margin-right="0mm" margin-bottom="12pt">
            <xsl:if test="ancestor::*[local-name() = 'table'][@class = 'recommendation' or @class='requirement' or @class='permission']">
                <xsl:attribute name="margin-bottom">0pt</xsl:attribute>
            </xsl:if>
            <fo:block-container margin-left="0mm" margin-right="0mm">
                <fo:table id="{@id}" table-layout="fixed" width="100%"> <!-- border="1pt solid black" -->
                    <xsl:if test="ancestor::*[local-name() = 'table'][@class = 'recommendation' or @class='requirement' or @class='permission']">
                        <!-- <xsl:attribute name="border">0.5pt solid black</xsl:attribute> -->
                    </xsl:if>
                    <xsl:variable name="simple-table">
                        <xsl:call-template name="getSimpleTable">
                            <xsl:with-param name="id" select="@id"/>
                        </xsl:call-template>
                    </xsl:variable>
                    <xsl:variable name="cols-count" select="count(xalan:nodeset($simple-table)//tr[1]/td)"/>
                    <xsl:if test="$cols-count = 2 and not(ancestor::*[local-name()='table'])">
                        <fo:table-column column-width="30%"/>
                        <fo:table-column column-width="70%"/>
                    </xsl:if>
                    <xsl:apply-templates mode="requirement"/>
                </fo:table>
                <!-- fn processing -->
                <xsl:if test=".//*[local-name() = 'fn']">
                    <xsl:for-each select="*[local-name() = 'tbody']">
                        <fo:block font-size="90%" border-bottom="1pt solid black">
                            <xsl:call-template name="table_fn_display"/>
                        </fo:block>
                    </xsl:for-each>
                </xsl:if>
            </fo:block-container>
        </fo:block-container>
    </xsl:template>

    <xsl:template match="*[local-name()='thead']" mode="requirement">
        <fo:table-header>
            <xsl:apply-templates mode="requirement"/>
        </fo:table-header>
    </xsl:template>

    <xsl:template match="*[local-name()='tbody']" mode="requirement">
        <fo:table-body>
            <xsl:apply-templates mode="requirement"/>
        </fo:table-body>
    </xsl:template>

    <xsl:template match="*[local-name()='tr']" mode="requirement">
        <fo:table-row height="7mm" border-bottom="0.5pt solid grey">

            <xsl:if test="parent::*[local-name()='thead'] or starts-with(*[local-name()='td' or local-name()='th'][1], 'Requirement ') or starts-with(*[local-name()='td' or local-name()='th'][1], 'Recommendation ')">
                <xsl:attribute name="font-weight">bold</xsl:attribute>

            </xsl:if>

            <xsl:apply-templates mode="requirement"/>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="*[local-name()='th']" mode="requirement">
        <fo:table-cell text-align="{@align}" display-align="center" padding="1mm" padding-left="2mm"> <!-- border="0.5pt solid black" -->
            <xsl:call-template name="setTextAlignment">
                <xsl:with-param name="default">left</xsl:with-param>
            </xsl:call-template>

            <xsl:call-template name="setTableCellAttributes"/>

            <fo:block>
                <xsl:apply-templates/>
            </fo:block>
        </fo:table-cell>
    </xsl:template>

    <xsl:template match="*[local-name()='td']" mode="requirement">
        <fo:table-cell text-align="{@align}" display-align="center" padding="1mm" padding-left="2mm"> <!-- border="0.5pt solid black" -->
            <xsl:if test="*[local-name() = 'table'][@class = 'recommendation' or @class='requirement' or @class='permission']">
                <xsl:attribute name="padding">0mm</xsl:attribute>
                <xsl:attribute name="padding-left">0mm</xsl:attribute>
            </xsl:if>
            <xsl:call-template name="setTextAlignment">
                <xsl:with-param name="default">left</xsl:with-param>
            </xsl:call-template>

            <xsl:if test="following-sibling::*[local-name()='td'] and not(preceding-sibling::*[local-name()='td'])">
                <xsl:attribute name="font-weight">bold</xsl:attribute>
            </xsl:if>

            <xsl:call-template name="setTableCellAttributes"/>

            <fo:block>
                <xsl:apply-templates/>
            </fo:block>
        </fo:table-cell>
    </xsl:template>

    <xsl:template match="*[local-name() = 'p'][@class='RecommendationTitle' or @class = 'RecommendationTestTitle']" priority="2">
        <fo:block font-size="11pt">

            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'p2'][ancestor::*[local-name() = 'table'][@class = 'recommendation' or @class='requirement' or @class='permission']]">
        <fo:block>
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    <!-- ========== -->
    <!-- END requirement, recommendation, permission table -->
    <!-- ========== -->

    <!-- ====== -->
    <!-- termexample -->
    <!-- ====== -->
    <xsl:template match="*[local-name() = 'termexample']">
        <fo:block id="{@id}" xsl:use-attribute-sets="termexample-style">
            <xsl:apply-templates select="*[local-name()='name']"/>
            <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'termexample']/*[local-name() = 'name']">
        <xsl:if test="normalize-space() != ''">
            <fo:inline xsl:use-attribute-sets="termexample-name-style">
                <xsl:apply-templates/>
            </fo:inline>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'termexample']/*[local-name() = 'p']">
        <xsl:variable name="element">inline


        </xsl:variable>
        <xsl:choose>
            <xsl:when test="contains($element, 'block')">
                <fo:block xsl:use-attribute-sets="example-p-style">

                    <xsl:apply-templates/>
                </fo:block>
            </xsl:when>
            <xsl:otherwise>
                <fo:inline><xsl:apply-templates/></fo:inline>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <!-- ====== -->
    <!-- ====== -->

    <!-- ====== -->
    <!-- example -->
    <!-- ====== -->

    <!-- There are a few cases:
    1. EXAMPLE text
    2. EXAMPLE
            text
    3. EXAMPLE text line 1
         text line 2
    4. EXAMPLE
         text line 1
             text line 2
    -->
    <xsl:template match="*[local-name() = 'example']">

        <fo:block-container id="{@id}" xsl:use-attribute-sets="example-style">

            <xsl:variable name="fo_element">
                <xsl:if test=".//*[local-name() = 'table'] or .//*[local-name() = 'dl'] or *[not(local-name() = 'name')][1][local-name() = 'sourcecode']">block</xsl:if>
                block
            </xsl:variable>

            <fo:block-container margin-left="0mm">

                <xsl:choose>

                    <xsl:when test="contains(normalize-space($fo_element), 'block')">

                        <!-- display name 'EXAMPLE' in a separate block  -->
                        <fo:block>
                            <xsl:apply-templates select="*[local-name()='name']">
                                <xsl:with-param name="fo_element" select="$fo_element"/>
                            </xsl:apply-templates>
                        </fo:block>

                        <fo:block-container xsl:use-attribute-sets="example-body-style">
                            <fo:block-container margin-left="0mm" margin-right="0mm">
                                <xsl:apply-templates select="node()[not(local-name() = 'name')]">
                                    <xsl:with-param name="fo_element" select="$fo_element"/>
                                </xsl:apply-templates>
                            </fo:block-container>
                        </fo:block-container>
                    </xsl:when> <!-- end block -->

                    <xsl:otherwise> <!-- inline -->

                        <!-- display 'EXAMPLE' and first element in the same line -->
                        <fo:block>
                            <xsl:apply-templates select="*[local-name()='name']">
                                <xsl:with-param name="fo_element" select="$fo_element"/>
                            </xsl:apply-templates>
                            <fo:inline>
                                <xsl:apply-templates select="*[not(local-name() = 'name')][1]">
                                    <xsl:with-param name="fo_element" select="$fo_element"/>
                                </xsl:apply-templates>
                            </fo:inline>
                        </fo:block>

                        <xsl:if test="*[not(local-name() = 'name')][position() &gt; 1]">
                            <!-- display further elements in blocks -->
                            <fo:block-container xsl:use-attribute-sets="example-body-style">
                                <fo:block-container margin-left="0mm" margin-right="0mm">
                                    <xsl:apply-templates select="*[not(local-name() = 'name')][position() &gt; 1]">
                                        <xsl:with-param name="fo_element" select="'block'"/>
                                    </xsl:apply-templates>
                                </fo:block-container>
                            </fo:block-container>
                        </xsl:if>
                    </xsl:otherwise> <!-- end inline -->

                </xsl:choose>
            </fo:block-container>
        </fo:block-container>
    </xsl:template>

    <xsl:template match="*[local-name() = 'example']/*[local-name() = 'name']">
        <xsl:param name="fo_element">block</xsl:param>

        <xsl:choose>
            <xsl:when test="ancestor::*[local-name() = 'appendix']">
                <fo:inline>
                    <xsl:apply-templates/>
                </fo:inline>
            </xsl:when>
            <xsl:when test="contains(normalize-space($fo_element), 'block')">
                <fo:block xsl:use-attribute-sets="example-name-style">
                    <xsl:apply-templates/>
                </fo:block>
            </xsl:when>
            <xsl:otherwise>
                <fo:inline xsl:use-attribute-sets="example-name-style">
                    <xsl:apply-templates/>
                </fo:inline>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>

    <xsl:template match="*[local-name() = 'example']/*[local-name() = 'p']">
        <xsl:param name="fo_element">block</xsl:param>

        <xsl:variable name="num"><xsl:number/></xsl:variable>
        <xsl:variable name="element">

            <xsl:value-of select="$fo_element"/>
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="starts-with(normalize-space($element), 'block')">
                <fo:block-container>
                    <xsl:if test="ancestor::*[local-name() = 'li'] and contains(normalize-space($fo_element), 'block')">
                        <xsl:attribute name="margin-left">0mm</xsl:attribute>
                        <xsl:attribute name="margin-right">0mm</xsl:attribute>
                    </xsl:if>
                    <fo:block xsl:use-attribute-sets="example-p-style">

                        <xsl:apply-templates/>
                    </fo:block>
                </fo:block-container>
            </xsl:when>
            <xsl:otherwise>
                <fo:inline xsl:use-attribute-sets="example-p-style">
                    <xsl:apply-templates/>
                </fo:inline>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- example/p -->
    <!-- ====== -->
    <!-- ====== -->

    <!-- ====== -->
    <!-- termsource -->
    <!-- origin -->
    <!-- modification -->
    <!-- ====== -->
    <xsl:template match="*[local-name() = 'termsource']" name="termsource">
        <fo:block xsl:use-attribute-sets="termsource-style">

            <!-- Example: [SOURCE: ISO 5127:2017, 3.1.6.02] -->
            <xsl:variable name="termsource_text">
                <xsl:apply-templates/>
            </xsl:variable>
            <xsl:copy-of select="$termsource_text"/>
            <!-- <xsl:choose>
                <xsl:when test="starts-with(normalize-space($termsource_text), '[')">
                    <xsl:copy-of select="$termsource_text"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:if test="$namespace = 'bsi'">
                        <xsl:choose>
                            <xsl:when test="$document_type = 'PAS' and starts-with(*[local-name() = 'origin']/@citeas, '[')"><xsl:text>{</xsl:text></xsl:when>
                            <xsl:otherwise><xsl:text>[</xsl:text></xsl:otherwise>
                        </xsl:choose>
                    </xsl:if>
                    <xsl:if test="$namespace = 'gb' or $namespace = 'iso' or $namespace = 'iec' or $namespace = 'itu' or $namespace = 'unece' or $namespace = 'unece-rec' or $namespace = 'nist-cswp'  or $namespace = 'nist-sp' or $namespace = 'ogc-white-paper' or $namespace = 'csa' or $namespace = 'csd' or $namespace = 'm3d' or $namespace = 'iho' or $namespace = 'bipm' or $namespace = 'jcgm'">
                        <xsl:text>[</xsl:text>
                    </xsl:if>
                    <xsl:copy-of select="$termsource_text"/>
                    <xsl:if test="$namespace = 'bsi'">
                        <xsl:choose>
                            <xsl:when test="$document_type = 'PAS' and starts-with(*[local-name() = 'origin']/@citeas, '[')"><xsl:text>}</xsl:text></xsl:when>
                            <xsl:otherwise><xsl:text>]</xsl:text></xsl:otherwise>
                        </xsl:choose>
                    </xsl:if>
                    <xsl:if test="$namespace = 'gb' or $namespace = 'iso' or $namespace = 'iec' or $namespace = 'itu' or $namespace = 'unece' or $namespace = 'unece-rec' or $namespace = 'nist-cswp'  or $namespace = 'nist-sp' or $namespace = 'ogc-white-paper' or $namespace = 'csa' or $namespace = 'csd' or $namespace = 'm3d' or $namespace = 'iho' or $namespace = 'bipm' or $namespace = 'jcgm'">
                        <xsl:text>]</xsl:text>
                    </xsl:if>
                </xsl:otherwise>
            </xsl:choose> -->
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'termsource']/text()[starts-with(., '[SOURCE: Adapted from: ') or     starts-with(., '[SOURCE: Quoted from: ') or     starts-with(., '[SOURCE: Modified from: ')]" priority="2">
        <xsl:text>[</xsl:text><xsl:value-of select="substring-after(., '[SOURCE: ')"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'termsource']/text()">
        <xsl:if test="normalize-space() != ''">
            <xsl:value-of select="."/>
        </xsl:if>
    </xsl:template>

    <!-- text SOURCE: -->
    <xsl:template match="*[local-name() = 'termsource']/*[local-name() = 'strong'][1][following-sibling::*[1][local-name() = 'origin']]/text()">
        <fo:inline xsl:use-attribute-sets="termsource-text-style">
            <xsl:value-of select="."/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'origin']">
        <fo:basic-link internal-destination="{@bibitemid}" fox:alt-text="{@citeas}">
            <xsl:if test="normalize-space(@citeas) = ''">
                <xsl:attribute name="fox:alt-text"><xsl:value-of select="@bibitemid"/></xsl:attribute>
            </xsl:if>
            <fo:inline xsl:use-attribute-sets="origin-style">
                <xsl:apply-templates/>
            </fo:inline>
        </fo:basic-link>
    </xsl:template>

    <!-- not using, see https://github.com/glossarist/iev-document/issues/23 -->
    <xsl:template match="*[local-name() = 'modification']">
        <xsl:variable name="title-modified">
            <xsl:call-template name="getLocalizedString">
                <xsl:with-param name="key">modified</xsl:with-param>
            </xsl:call-template>
        </xsl:variable>

    <xsl:variable name="text"><xsl:apply-templates/></xsl:variable>
        <xsl:choose>
            <xsl:when test="$lang = 'zh'"><xsl:text>、</xsl:text><xsl:value-of select="$title-modified"/><xsl:if test="normalize-space($text) != ''"><xsl:text>—</xsl:text></xsl:if></xsl:when>
            <xsl:otherwise><xsl:text>, </xsl:text><xsl:value-of select="$title-modified"/><xsl:if test="normalize-space($text) != ''"><xsl:text> — </xsl:text></xsl:if></xsl:otherwise>
        </xsl:choose>
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'modification']/*[local-name() = 'p']">
        <fo:inline><xsl:apply-templates/></fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'modification']/text()">
        <xsl:if test="normalize-space() != ''">
            <!-- <xsl:value-of select="."/> -->
            <xsl:call-template name="text"/>
        </xsl:if>
    </xsl:template>

    <!-- ====== -->
    <!-- ====== -->

    <!-- ====== -->
    <!-- qoute -->
    <!-- source -->
    <!-- author  -->
    <!-- ====== -->
    <xsl:template match="*[local-name() = 'quote']">
        <fo:block-container margin-left="0mm">
            <xsl:if test="parent::*[local-name() = 'note']">
                <xsl:if test="not(ancestor::*[local-name() = 'table'])">
                    <xsl:attribute name="margin-left">5mm</xsl:attribute>
                </xsl:if>
            </xsl:if>

                <xsl:attribute name="margin-left">0mm</xsl:attribute>

            <fo:block-container margin-left="0mm">
                <fo:block-container xsl:use-attribute-sets="quote-style">

                    <fo:block-container margin-left="0mm" margin-right="0mm">
                        <fo:block role="BlockQuote">
                            <xsl:apply-templates select="./node()[not(local-name() = 'author') and not(local-name() = 'source')]"/> <!-- process all nested nodes, except author and source -->
                        </fo:block>
                    </fo:block-container>
                </fo:block-container>
                <xsl:if test="*[local-name() = 'author'] or *[local-name() = 'source']">
                    <fo:block xsl:use-attribute-sets="quote-source-style">
                        <!-- — ISO, ISO 7301:2011, Clause 1 -->
                        <xsl:apply-templates select="*[local-name() = 'author']"/>
                        <xsl:apply-templates select="*[local-name() = 'source']"/>
                    </fo:block>
                </xsl:if>

            </fo:block-container>
        </fo:block-container>
    </xsl:template>

    <xsl:template match="*[local-name() = 'source']">
        <xsl:if test="../*[local-name() = 'author']">
            <xsl:text>, </xsl:text>
        </xsl:if>
        <fo:basic-link internal-destination="{@bibitemid}" fox:alt-text="{@citeas}">
            <xsl:apply-templates/>
        </fo:basic-link>
    </xsl:template>

    <xsl:template match="*[local-name() = 'author']">
        <xsl:text>— </xsl:text>
        <xsl:apply-templates/>
    </xsl:template>
    <!-- ====== -->
    <!-- ====== -->

    <xsl:variable name="bibitems_">
        <xsl:for-each select="//*[local-name() = 'bibitem']">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:variable>
    <xsl:variable name="bibitems" select="xalan:nodeset($bibitems_)"/>

    <!-- get all hidden bibitems to exclude them from eref/origin processing -->
    <xsl:variable name="bibitems_hidden_">
        <xsl:for-each select="//*[local-name() = 'bibitem'][@hidden='true']">
            <xsl:copy-of select="."/>
        </xsl:for-each>
        <xsl:for-each select="//*[local-name() = 'references'][@hidden='true']//*[local-name() = 'bibitem']">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:variable>
    <xsl:variable name="bibitems_hidden" select="xalan:nodeset($bibitems_hidden_)"/>
    <!-- ====== -->
    <!-- eref -->
    <!-- ====== -->
    <xsl:template match="*[local-name() = 'eref']">
        <xsl:variable name="current_bibitemid" select="@bibitemid"/>
        <!-- <xsl:variable name="external-destination" select="normalize-space(key('bibitems', $current_bibitemid)/*[local-name() = 'uri'][@type = 'citation'])"/> -->
        <xsl:variable name="external-destination" select="normalize-space($bibitems/*[local-name() ='bibitem'][@id = $current_bibitemid]/*[local-name() = 'uri'][@type = 'citation'])"/>
        <xsl:choose>
            <!-- <xsl:when test="$external-destination != '' or not(key('bibitems_hidden', $current_bibitemid))"> --> <!-- if in the bibliography there is the item with @bibitemid (and not hidden), then create link (internal to the bibitem or external) -->
            <xsl:when test="$external-destination != '' or not($bibitems_hidden/*[local-name() ='bibitem'][@id = $current_bibitemid])"> <!-- if in the bibliography there is the item with @bibitemid (and not hidden), then create link (internal to the bibitem or external) -->
                <fo:inline xsl:use-attribute-sets="eref-style">
                    <xsl:if test="@type = 'footnote'">
                        <xsl:attribute name="keep-together.within-line">always</xsl:attribute>
                        <xsl:attribute name="keep-with-previous.within-line">always</xsl:attribute>
                        <xsl:attribute name="vertical-align">super</xsl:attribute>
                        <xsl:attribute name="font-size">80%</xsl:attribute>

                            <xsl:attribute name="font-size">50%</xsl:attribute>

                    </xsl:if>

                    <xsl:variable name="citeas" select="java:replaceAll(java:java.lang.String.new(@citeas),'^\[?(.+?)\]?$','$1')"/> <!-- remove leading and trailing brackets -->
                    <xsl:variable name="text" select="normalize-space()"/>

                    <fo:basic-link fox:alt-text="{@citeas}">
                        <xsl:if test="normalize-space(@citeas) = ''">
                            <xsl:attribute name="fox:alt-text"><xsl:value-of select="."/></xsl:attribute>
                        </xsl:if>
                        <xsl:if test="@type = 'inline'">

                        </xsl:if>

                        <xsl:choose>
                            <xsl:when test="$external-destination != ''"> <!-- external hyperlink -->
                                <xsl:attribute name="external-destination"><xsl:value-of select="$external-destination"/></xsl:attribute>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:attribute name="internal-destination"><xsl:value-of select="@bibitemid"/></xsl:attribute>
                            </xsl:otherwise>
                        </xsl:choose>

                        <xsl:apply-templates/>
                    </fo:basic-link>

                </fo:inline>
            </xsl:when>
            <xsl:otherwise> <!-- if there is key('bibitems_hidden', $current_bibitemid) -->

                <!-- if in bibitem[@hidden='true'] there is url[@type='src'], then create hyperlink  -->
                <xsl:variable name="uri_src" select="normalize-space($bibitems_hidden/*[local-name() ='bibitem'][@id = $current_bibitemid]/*[local-name() = 'uri'][@type = 'src'])"/>
                <xsl:choose>
                    <xsl:when test="$uri_src != ''">
                        <fo:basic-link external-destination="{$uri_src}" fox:alt-text="{$uri_src}"><xsl:apply-templates/></fo:basic-link>
                    </xsl:when>
                    <xsl:otherwise><fo:inline><xsl:apply-templates/></fo:inline></xsl:otherwise>
                </xsl:choose>

            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <!-- ====== -->
    <!-- END eref -->
    <!-- ====== -->

    <!-- Tabulation processing -->
    <xsl:template match="*[local-name() = 'tab']">
        <!-- zero-space char -->
        <xsl:variable name="depth">
            <xsl:call-template name="getLevel">
                <xsl:with-param name="depth" select="../@depth"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:variable name="padding">

            3


        </xsl:variable>

        <xsl:variable name="padding-right">
            <xsl:choose>
                <xsl:when test="normalize-space($padding) = ''">0</xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="normalize-space($padding)"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:choose>
            <xsl:when test="$lang = 'zh'">
                <fo:inline><xsl:value-of select="$tab_zh"/></fo:inline>
            </xsl:when>
            <xsl:when test="../../@inline-header = 'true'">
                <fo:inline font-size="90%">
                    <xsl:call-template name="insertNonBreakSpaces">
                        <xsl:with-param name="count" select="$padding-right"/>
                    </xsl:call-template>
                </fo:inline>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="direction"><xsl:if test="$lang = 'ar'"><xsl:value-of select="$RLM"/></xsl:if></xsl:variable>
                <fo:inline padding-right="{$padding-right}mm"><xsl:value-of select="$direction"/>​</fo:inline>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template> <!-- tab -->

    <xsl:template name="insertNonBreakSpaces">
        <xsl:param name="count"/>
        <xsl:if test="$count &gt; 0">
            <xsl:text> </xsl:text>
            <xsl:call-template name="insertNonBreakSpaces">
                <xsl:with-param name="count" select="$count - 1"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <!-- Preferred, admitted, deprecated -->
    <xsl:template match="*[local-name() = 'preferred']">
        <xsl:variable name="level">
            <xsl:call-template name="getLevel"/>
        </xsl:variable>
        <xsl:variable name="font-size">
            inherit
        </xsl:variable>
        <xsl:variable name="levelTerm">
            <xsl:call-template name="getLevelTermName"/>
        </xsl:variable>
        <fo:block font-size="{normalize-space($font-size)}" role="H{$levelTerm}" xsl:use-attribute-sets="preferred-block-style">

            <xsl:if test="parent::*[local-name() = 'term'] and not(preceding-sibling::*[local-name() = 'preferred'])"> <!-- if first preffered in term, then display term's name -->
                <fo:block xsl:use-attribute-sets="term-name-style">
                    <xsl:apply-templates select="ancestor::*[local-name() = 'term'][1]/*[local-name() = 'name']"/>
                </fo:block>
            </xsl:if>

            <fo:block xsl:use-attribute-sets="preferred-term-style">
                <xsl:call-template name="setStyle_preferred"/>
                <xsl:apply-templates/>
            </fo:block>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'domain']">
        <fo:inline xsl:use-attribute-sets="domain-style">&lt;<xsl:apply-templates/>&gt;</fo:inline>
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="*[local-name() = 'admitted']">
        <fo:block xsl:use-attribute-sets="admitted-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'deprecates']">
        <xsl:variable name="title-deprecated">
            <xsl:call-template name="getLocalizedString">
                <xsl:with-param name="key">deprecated</xsl:with-param>
            </xsl:call-template>
        </xsl:variable>
        <fo:block xsl:use-attribute-sets="deprecates-style">
            <xsl:value-of select="$title-deprecated"/>: <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template name="setStyle_preferred">
        <xsl:if test="*[local-name() = 'strong']">
            <xsl:attribute name="font-weight">normal</xsl:attribute>
        </xsl:if>
    </xsl:template>

    <!-- regarding ISO 10241-1:2011,  If there is more than one preferred term, each preferred term follows the previous one on a new line. -->
    <!-- in metanorma xml preferred terms delimited by semicolons -->
    <xsl:template match="*[local-name() = 'preferred']/text()[contains(., ';')] | *[local-name() = 'preferred']/*[local-name() = 'strong']/text()[contains(., ';')]">
        <xsl:value-of select="java:replaceAll(java:java.lang.String.new(.), ';', $linebreak)"/>
    </xsl:template>
    <!--  End Preferred, admitted, deprecated -->

    <!-- ========== -->
    <!-- definition -->
    <!-- ========== -->
    <xsl:template match="*[local-name() = 'definition']">
        <fo:block xsl:use-attribute-sets="definition-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'definition'][preceding-sibling::*[local-name() = 'domain']]">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="*[local-name() = 'definition'][preceding-sibling::*[local-name() = 'domain']]/*[local-name() = 'p'][1]">
        <fo:inline> <xsl:apply-templates/></fo:inline>
        <fo:block/>
    </xsl:template>
    <!-- ========== -->
    <!-- END definition -->
    <!-- ========== -->

    <!-- main sections -->
    <xsl:template match="/*/*[local-name() = 'sections']/*" priority="2">

        <fo:block>
            <xsl:call-template name="setId"/>

                <xsl:variable name="pos"><xsl:number count="gb:sections/gb:clause | gb:sections/gb:terms"/></xsl:variable>
                <xsl:if test="$pos &gt;= 2">
                    <xsl:attribute name="space-before">18pt</xsl:attribute>
                </xsl:if>

            <xsl:apply-templates/>
        </fo:block>

    </xsl:template>

    <xsl:template match="//*[contains(local-name(), '-standard')]/*[local-name() = 'preface']/*" priority="2"> <!-- /*/*[local-name() = 'preface']/* -->
        <fo:block break-after="page"/>
        <fo:block>
            <xsl:call-template name="setId"/>
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'clause']">
        <fo:block>
            <xsl:call-template name="setId"/>

            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'definitions']">
        <fo:block id="{@id}">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'annex']">
        <fo:block break-after="page"/>
        <fo:block id="{@id}">

        </fo:block>
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'review']"> <!-- 'review' will be processed in mn2pdf/review.xsl -->
        <!-- comment 2019-11-29 -->
        <!-- <fo:block font-weight="bold">Review:</fo:block>
        <xsl:apply-templates /> -->

        <xsl:variable name="id_from" select="normalize-space(current()/@from)"/>

        <xsl:choose>
            <!-- if there isn't the attribute '@from', then -->
            <xsl:when test="$id_from = ''">
                <fo:block id="{@id}" font-size="1pt"><xsl:value-of select="$hair_space"/></fo:block>
            </xsl:when>
            <!-- if there isn't element with id 'from', then create 'bookmark' here -->
            <xsl:when test="not(ancestor::*[contains(local-name(), '-standard')]//*[@id = $id_from])">
                <fo:block id="{@from}" font-size="1pt"><xsl:value-of select="$hair_space"/></fo:block>
            </xsl:when>
        </xsl:choose>

    </xsl:template>

    <xsl:template match="*[local-name() = 'name']/text()">
        <!-- 0xA0 to space replacement -->
        <xsl:value-of select="java:replaceAll(java:java.lang.String.new(.),' ',' ')"/>
    </xsl:template>

    <!-- ===================================== -->
    <!-- Lists processing -->
    <!-- ===================================== -->
    <xsl:variable name="ul_labels_">

                <label>—</label> <!-- em dash -->

    </xsl:variable>
    <xsl:variable name="ul_labels" select="xalan:nodeset($ul_labels_)"/>

    <xsl:template name="setULLabel">
        <xsl:variable name="list_level_" select="count(ancestor::*[local-name() = 'ul']) + count(ancestor::*[local-name() = 'ol'])"/>
        <xsl:variable name="list_level">
            <xsl:choose>
                <xsl:when test="$list_level_ &lt;= 3"><xsl:value-of select="$list_level_"/></xsl:when>
                <xsl:otherwise><xsl:value-of select="$list_level_ mod 3"/></xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="$ul_labels/label[not(@level)]"> <!-- one label for all levels -->
                <xsl:apply-templates select="$ul_labels/label[not(@level)]" mode="ul_labels"/>
            </xsl:when>
            <xsl:when test="$list_level mod 3 = 0">
                <xsl:apply-templates select="$ul_labels/label[@level = 3]" mode="ul_labels"/>
            </xsl:when>
            <xsl:when test="$list_level mod 2 = 0">
                <xsl:apply-templates select="$ul_labels/label[@level = 2]" mode="ul_labels"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="$ul_labels/label[@level = 1]" mode="ul_labels"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template match="label" mode="ul_labels">
        <xsl:copy-of select="@*[not(local-name() = 'level')]"/>
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template name="getListItemFormat">
        <!-- Example: for BSI <?list-type loweralpha?> -->
        <xsl:variable name="processing_instruction_type" select="normalize-space(../preceding-sibling::*[1]/processing-instruction('list-type'))"/>
        <xsl:choose>
            <xsl:when test="local-name(..) = 'ul'">
                <xsl:choose>
                    <xsl:when test="normalize-space($processing_instruction_type) = 'simple'"/>
                    <xsl:otherwise><xsl:call-template name="setULLabel"/></xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise> <!-- for ordered lists 'ol' -->

                <!-- Example: for BSI <?list-start 2?> -->
                <xsl:variable name="processing_instruction_start" select="normalize-space(../preceding-sibling::*[1]/processing-instruction('list-start'))"/>

                <xsl:variable name="start_value">
                    <xsl:choose>
                        <xsl:when test="normalize-space($processing_instruction_start) != ''">
                            <xsl:value-of select="number($processing_instruction_start) - 1"/><!-- if start="3" then start_value=2 + xsl:number(1) = 3 -->
                        </xsl:when>
                        <xsl:when test="normalize-space(../@start) != ''">
                            <xsl:value-of select="number(../@start) - 1"/><!-- if start="3" then start_value=2 + xsl:number(1) = 3 -->
                        </xsl:when>
                        <xsl:otherwise>0</xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>

                <xsl:variable name="curr_value"><xsl:number/></xsl:variable>

                <xsl:variable name="type">
                    <xsl:choose>
                        <xsl:when test="normalize-space($processing_instruction_type) != ''"><xsl:value-of select="$processing_instruction_type"/></xsl:when>
                        <xsl:when test="normalize-space(../@type) != ''"><xsl:value-of select="../@type"/></xsl:when>

                        <xsl:otherwise> <!-- if no @type or @class = 'steps' -->

                            <xsl:variable name="list_level_" select="count(ancestor::*[local-name() = 'ul']) + count(ancestor::*[local-name() = 'ol'])"/>
                            <xsl:variable name="list_level">
                                <xsl:choose>
                                    <xsl:when test="$list_level_ &lt;= 5"><xsl:value-of select="$list_level_"/></xsl:when>
                                    <xsl:otherwise><xsl:value-of select="$list_level_ mod 5"/></xsl:otherwise>
                                </xsl:choose>
                            </xsl:variable>

                            <xsl:choose>
                                <xsl:when test="$list_level mod 5 = 0">roman_upper</xsl:when> <!-- level 5 -->
                                <xsl:when test="$list_level mod 4 = 0">alphabet_upper</xsl:when> <!-- level 4 -->
                                <xsl:when test="$list_level mod 3 = 0">roman</xsl:when> <!-- level 3 -->
                                <xsl:when test="$list_level mod 2 = 0 and ancestor::*/@class = 'steps'">alphabet</xsl:when> <!-- level 2 and @class = 'steps'-->
                                <xsl:when test="$list_level mod 2 = 0">arabic</xsl:when> <!-- level 2 -->
                                <xsl:otherwise> <!-- level 1 -->
                                    <xsl:choose>
                                        <xsl:when test="ancestor::*/@class = 'steps'">arabic</xsl:when>
                                        <xsl:otherwise>alphabet</xsl:otherwise>
                                    </xsl:choose>
                                </xsl:otherwise>
                            </xsl:choose>

                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>

                <xsl:variable name="format">
                    <xsl:choose>
                        <xsl:when test="$type = 'arabic'">
                            1)
                        </xsl:when>
                        <xsl:when test="$type = 'alphabet'">
                            a)
                        </xsl:when>
                        <xsl:when test="$type = 'alphabet_upper'">
                            A.
                        </xsl:when>
                        <xsl:when test="$type = 'roman'">
                            i)
                        </xsl:when>
                        <xsl:when test="$type = 'roman_upper'">I.</xsl:when>
                        <xsl:otherwise>1.</xsl:otherwise> <!-- for any case, if $type has non-determined value, not using -->
                    </xsl:choose>
                </xsl:variable>

                <xsl:number value="$start_value + $curr_value" format="{normalize-space($format)}" lang="en"/>

            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="*[local-name() = 'ul'] | *[local-name() = 'ol']">
        <xsl:choose>
            <xsl:when test="parent::*[local-name() = 'note'] or parent::*[local-name() = 'termnote']">
                <fo:block-container>
                    <xsl:attribute name="margin-left">
                        <xsl:choose>
                            <xsl:when test="not(ancestor::*[local-name() = 'table'])"><xsl:value-of select="$note-body-indent"/></xsl:when>
                            <xsl:otherwise><xsl:value-of select="$note-body-indent-table"/></xsl:otherwise>
                        </xsl:choose>
                    </xsl:attribute>

                        <xsl:attribute name="margin-left">0mm</xsl:attribute>

                    <fo:block-container margin-left="0mm">
                        <fo:block>
                            <xsl:apply-templates select="." mode="list"/>
                        </fo:block>
                    </fo:block-container>
                </fo:block-container>
            </xsl:when>
            <xsl:otherwise>
                <fo:block>
                    <xsl:apply-templates select="." mode="list"/>
                </fo:block>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="*[local-name()='ul'] | *[local-name()='ol']" mode="list" name="list">

        <xsl:apply-templates select="*[local-name() = 'name']">
            <xsl:with-param name="process">true</xsl:with-param>
        </xsl:apply-templates>

        <fo:list-block xsl:use-attribute-sets="list-style">

                <xsl:if test="local-name() = 'ol'">
                    <xsl:attribute name="provisional-distance-between-starts">7mm</xsl:attribute>
                </xsl:if>

            <xsl:if test="*[local-name() = 'name']">
                <xsl:attribute name="margin-top">0pt</xsl:attribute>
            </xsl:if>

            <xsl:apply-templates select="node()[not(local-name() = 'note')]"/>
        </fo:list-block>
        <!-- <xsl:for-each select="./iho:note">
            <xsl:call-template name="note"/>
        </xsl:for-each> -->
        <xsl:apply-templates select="./*[local-name() = 'note']"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'ol' or local-name() = 'ul']/*[local-name() = 'name']">
        <xsl:param name="process">false</xsl:param>
        <xsl:if test="$process = 'true'">
            <fo:block xsl:use-attribute-sets="list-name-style">
                <xsl:apply-templates/>
            </fo:block>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name()='li']">
        <fo:list-item xsl:use-attribute-sets="list-item-style">
            <xsl:copy-of select="@id"/>

            <fo:list-item-label end-indent="label-end()">
                <fo:block xsl:use-attribute-sets="list-item-label-style">

                    <!-- if 'p' contains all text in 'add' first and last elements in first p are 'add' -->
                    <xsl:if test="*[1][count(node()[normalize-space() != '']) = 1 and *[local-name() = 'add']]">
                        <xsl:call-template name="append_add-style"/>
                    </xsl:if>

                    <xsl:call-template name="getListItemFormat"/>
                </fo:block>
            </fo:list-item-label>
            <fo:list-item-body start-indent="body-start()" xsl:use-attribute-sets="list-item-body-style">
                <fo:block>

                    <xsl:apply-templates/>

                    <!-- <xsl:apply-templates select="node()[not(local-name() = 'note')]" />
                    
                    <xsl:for-each select="./bsi:note">
                        <xsl:call-template name="note"/>
                    </xsl:for-each> -->
                </fo:block>
            </fo:list-item-body>
        </fo:list-item>
    </xsl:template>

    <!-- ===================================== -->
    <!-- END Lists processing -->
    <!-- ===================================== -->

    <!-- =================== -->
    <!-- Index section processing -->
    <!-- =================== -->

    <xsl:variable name="index" select="document($external_index)"/>

    <xsl:variable name="bookmark_in_fn">
        <xsl:for-each select="//*[local-name() = 'bookmark'][ancestor::*[local-name() = 'fn']]">
            <bookmark><xsl:value-of select="@id"/></bookmark>
        </xsl:for-each>
    </xsl:variable>

    <xsl:template match="@*|node()" mode="index_add_id">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="index_add_id"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'xref']" mode="index_add_id">
        <xsl:variable name="id">
            <xsl:call-template name="generateIndexXrefId"/>
        </xsl:variable>
        <xsl:copy> <!-- add id to xref -->
            <xsl:apply-templates select="@*" mode="index_add_id"/>
            <xsl:attribute name="id">
                <xsl:value-of select="$id"/>
            </xsl:attribute>
            <xsl:apply-templates mode="index_add_id"/>
        </xsl:copy>
        <!-- split <xref target="bm1" to="End" pagenumber="true"> to two xref:
        <xref target="bm1" pagenumber="true"> and <xref target="End" pagenumber="true"> -->
        <xsl:if test="@to">
            <xsl:value-of select="$en_dash"/>
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:attribute name="target"><xsl:value-of select="@to"/></xsl:attribute>
                <xsl:attribute name="id">
                    <xsl:value-of select="$id"/><xsl:text>_to</xsl:text>
                </xsl:attribute>
                <xsl:apply-templates mode="index_add_id"/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>

    <xsl:template match="@*|node()" mode="index_update">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="index_update"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'indexsect']//*[local-name() = 'li']" mode="index_update">
        <xsl:copy>
            <xsl:apply-templates select="@*" mode="index_update"/>
        <xsl:apply-templates select="node()[1]" mode="process_li_element"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'indexsect']//*[local-name() = 'li']/node()" mode="process_li_element" priority="2">
        <xsl:param name="element"/>
        <xsl:param name="remove" select="'false'"/>
        <xsl:param name="target"/>
        <!-- <node></node> -->
        <xsl:choose>
            <xsl:when test="self::text()  and (normalize-space(.) = ',' or normalize-space(.) = $en_dash) and $remove = 'true'">
                <!-- skip text (i.e. remove it) and process next element -->
                <!-- [removed_<xsl:value-of select="."/>] -->
                <xsl:apply-templates select="following-sibling::node()[1]" mode="process_li_element">
                    <xsl:with-param name="target"><xsl:value-of select="$target"/></xsl:with-param>
                </xsl:apply-templates>
            </xsl:when>
            <xsl:when test="self::text()">
                <xsl:value-of select="."/>
                <xsl:apply-templates select="following-sibling::node()[1]" mode="process_li_element"/>
            </xsl:when>
            <xsl:when test="self::* and local-name(.) = 'xref'">
                <xsl:variable name="id" select="@id"/>
                <xsl:variable name="page" select="$index//item[@id = $id]"/>
                <xsl:variable name="id_next" select="following-sibling::*[local-name() = 'xref'][1]/@id"/>
                <xsl:variable name="page_next" select="$index//item[@id = $id_next]"/>

                <xsl:variable name="id_prev" select="preceding-sibling::*[local-name() = 'xref'][1]/@id"/>
                <xsl:variable name="page_prev" select="$index//item[@id = $id_prev]"/>

                <xsl:choose>
                    <!-- 2nd pass -->
                    <!-- if page is equal to page for next and page is not the end of range -->
                    <xsl:when test="$page != '' and $page_next != '' and $page = $page_next and not(contains($page, '_to'))">  <!-- case: 12, 12-14 -->
                        <!-- skip element (i.e. remove it) and remove next text ',' -->
                        <!-- [removed_xref] -->

                        <xsl:apply-templates select="following-sibling::node()[1]" mode="process_li_element">
                            <xsl:with-param name="remove">true</xsl:with-param>
                            <xsl:with-param name="target">
                                <xsl:choose>
                                    <xsl:when test="$target != ''"><xsl:value-of select="$target"/></xsl:when>
                                    <xsl:otherwise><xsl:value-of select="@target"/></xsl:otherwise>
                                </xsl:choose>
                            </xsl:with-param>
                        </xsl:apply-templates>
                    </xsl:when>

                    <xsl:when test="$page != '' and $page_prev != '' and $page = $page_prev and contains($page_prev, '_to')"> <!-- case: 12-14, 14, ... -->
                        <!-- remove xref -->
                        <xsl:apply-templates select="following-sibling::node()[1]" mode="process_li_element">
                            <xsl:with-param name="remove">true</xsl:with-param>
                        </xsl:apply-templates>
                    </xsl:when>

                    <xsl:otherwise>
                        <xsl:apply-templates select="." mode="xref_copy">
                            <xsl:with-param name="target" select="$target"/>
                        </xsl:apply-templates>
                        <xsl:apply-templates select="following-sibling::node()[1]" mode="process_li_element"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:when test="self::* and local-name(.) = 'ul'">
                <!-- ul -->
                <xsl:apply-templates select="." mode="index_update"/>
            </xsl:when>
            <xsl:otherwise>
             <xsl:apply-templates select="." mode="xref_copy">
                    <xsl:with-param name="target" select="$target"/>
                </xsl:apply-templates>
                <xsl:apply-templates select="following-sibling::node()[1]" mode="process_li_element"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="@*|node()" mode="xref_copy">
        <xsl:param name="target"/>
        <xsl:copy>
            <xsl:apply-templates select="@*" mode="xref_copy"/>
            <xsl:if test="$target != '' and not(xalan:nodeset($bookmark_in_fn)//bookmark[. = $target])">
                <xsl:attribute name="target"><xsl:value-of select="$target"/></xsl:attribute>
            </xsl:if>
            <xsl:apply-templates select="node()" mode="xref_copy"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template name="generateIndexXrefId">
        <xsl:variable name="level" select="count(ancestor::*[local-name() = 'ul'])"/>

        <xsl:variable name="docid">
            <xsl:call-template name="getDocumentId"/>
        </xsl:variable>
        <xsl:variable name="item_number">
            <xsl:number count="*[local-name() = 'li'][ancestor::*[local-name() = 'indexsect']]" level="any"/>
        </xsl:variable>
        <xsl:variable name="xref_number"><xsl:number count="*[local-name() = 'xref']"/></xsl:variable>
        <xsl:value-of select="concat($docid, '_', $item_number, '_', $xref_number)"/> <!-- $level, '_',  -->
    </xsl:template>

    <xsl:template match="*[local-name() = 'indexsect']/*[local-name() = 'title']" priority="4">
        <fo:block xsl:use-attribute-sets="indexsect-title-style">
            <!-- Index -->
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'indexsect']/*[local-name() = 'clause']/*[local-name() = 'title']" priority="4">
        <!-- Letter A, B, C, ... -->
        <fo:block xsl:use-attribute-sets="indexsect-clause-title-style">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'indexsect']/*[local-name() = 'clause']" priority="4">
        <xsl:apply-templates/>
        <fo:block>
            <xsl:if test="following-sibling::*[local-name() = 'clause']">
                <fo:block> </fo:block>
            </xsl:if>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'indexsect']//*[local-name() = 'ul']" priority="4">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'indexsect']//*[local-name() = 'li']" priority="4">
        <xsl:variable name="level" select="count(ancestor::*[local-name() = 'ul'])"/>
        <fo:block start-indent="{5 * $level}mm" text-indent="-5mm">

            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'indexsect']//*[local-name() = 'li']/text()">
        <!-- to split by '_' and other chars -->
        <xsl:call-template name="add-zero-spaces-java"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'table']/*[local-name() = 'bookmark']" priority="2"/>

    <xsl:template match="*[local-name() = 'bookmark']" name="bookmark">
        <!-- <fo:inline id="{@id}" font-size="1pt"/> -->
        <fo:inline id="{@id}" font-size="1pt"><xsl:value-of select="$hair_space"/></fo:inline>
        <!-- we need to add zero-width space, otherwise this fo:inline is missing in IF xml -->
        <xsl:if test="not(following-sibling::node()[normalize-space() != ''])"><fo:inline font-size="1pt"> </fo:inline></xsl:if>
    </xsl:template>
    <!-- =================== -->
    <!-- End of Index processing -->
    <!-- =================== -->

    <!-- ============ -->
    <!-- errata -->
    <!-- ============ -->
    <xsl:template match="*[local-name() = 'errata']">
        <!-- <row>
                    <date>05-07-2013</date>
                    <type>Editorial</type>
                    <change>Changed CA-9 Priority Code from P1 to P2 in <xref target="tabled2"/>.</change>
                    <pages>D-3</pages>
                </row>
        -->
        <fo:table table-layout="fixed" width="100%" font-size="10pt" border="1pt solid black">
            <fo:table-column column-width="20mm"/>
            <fo:table-column column-width="23mm"/>
            <fo:table-column column-width="107mm"/>
            <fo:table-column column-width="15mm"/>
            <fo:table-body>
                <fo:table-row text-align="center" font-weight="bold" background-color="black" color="white">

                    <fo:table-cell border="1pt solid black"><fo:block>Date</fo:block></fo:table-cell>
                    <fo:table-cell border="1pt solid black"><fo:block>Type</fo:block></fo:table-cell>
                    <fo:table-cell border="1pt solid black"><fo:block>Change</fo:block></fo:table-cell>
                    <fo:table-cell border="1pt solid black"><fo:block>Pages</fo:block></fo:table-cell>
                </fo:table-row>
                <xsl:apply-templates/>
            </fo:table-body>
        </fo:table>
    </xsl:template>

    <xsl:template match="*[local-name() = 'errata']/*[local-name() = 'row']">
        <fo:table-row>
            <xsl:apply-templates/>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="*[local-name() = 'errata']/*[local-name() = 'row']/*">
        <fo:table-cell border="1pt solid black" padding-left="1mm" padding-top="0.5mm">
            <fo:block><xsl:apply-templates/></fo:block>
        </fo:table-cell>
    </xsl:template>
    <!-- ============ -->
    <!-- END errata -->
    <!-- ============ -->

    <!-- ======================= -->
    <!-- Bibliography rendering -->
    <!-- ======================= -->

    <!-- ========================================================== -->
    <!-- Reference sections (Normative References and Bibliography) -->
    <!-- ========================================================== -->
    <xsl:template match="*[local-name() = 'references'][@hidden='true']" priority="3"/>
    <xsl:template match="*[local-name() = 'bibitem'][@hidden='true']" priority="3"/>
    <!-- don't display bibitem with @id starts with '_hidden', that was introduced for references integrity -->
    <xsl:template match="*[local-name() = 'bibitem'][starts-with(@id, 'hidden_bibitem_')]" priority="3"/>

    <!-- Normative references -->
    <xsl:template match="*[local-name() = 'references'][@normative='true']" priority="2">

        <fo:block id="{@id}">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <!-- Bibliography (non-normative references) -->
    <xsl:template match="*[local-name() = 'references']">
        <xsl:if test="not(ancestor::*[local-name() = 'annex'])">

                    <fo:block break-after="page"/>

        </xsl:if>

        <!-- <xsl:if test="ancestor::*[local-name() = 'annex']">
            <xsl:if test="$namespace = 'csa' or $namespace = 'csd' or $namespace = 'gb' or $namespace = 'iec' or $namespace = 'iso' or $namespace = 'itu'">
                <fo:block break-after="page"/>
            </xsl:if>
        </xsl:if> -->

        <fo:block id="{@id}" xsl:use-attribute-sets="references-non-normative-style">
            <xsl:apply-templates/>
        </fo:block>

            <!-- horizontal line -->
            <fo:block-container text-align="center">
                <fo:block-container margin-left="63mm" width="42mm" border-bottom="2pt solid black">
                    <fo:block> </fo:block>
                </fo:block-container>
            </fo:block-container>

    </xsl:template> <!-- references -->

    <xsl:template match="*[local-name() = 'bibitem']">
        <xsl:call-template name="bibitem"/>
    </xsl:template>

    <!-- Normative references -->
    <xsl:template match="*[local-name() = 'references'][@normative='true']/*[local-name() = 'bibitem']" name="bibitem" priority="2">

                <fo:block id="{@id}" xsl:use-attribute-sets="bibitem-normative-style">
                    <xsl:call-template name="processBibitem"/>
                </fo:block>

    </xsl:template> <!-- bibitem -->

    <!-- Bibliography (non-normative references) -->
    <xsl:template match="*[local-name() = 'references'][not(@normative='true')]/*[local-name() = 'bibitem']" name="bibitem_non_normative" priority="2">

         <!-- $namespace = 'csd' or $namespace = 'gb' or $namespace = 'iec' or $namespace = 'ieee' or $namespace = 'iso' or $namespace = 'jcgm' or $namespace = 'm3d' or 
            $namespace = 'mpfd' or $namespace = 'ogc' or $namespace = 'ogc-white-paper' -->
                <!-- Example: [1] ISO 9:1995, Information and documentation – Transliteration of Cyrillic characters into Latin characters – Slavic and non-Slavic languages -->
                <fo:list-block id="{@id}" xsl:use-attribute-sets="bibitem-non-normative-list-style">
                    <fo:list-item>
                        <fo:list-item-label end-indent="label-end()">
                            <fo:block>
                                <fo:inline>

                                            <xsl:value-of select="*[local-name()='docidentifier'][@type = 'metanorma-ordinal']"/>
                                            <xsl:if test="not(*[local-name()='docidentifier'][@type = 'metanorma-ordinal'])">
                                                <xsl:number format="[1]" count="*[local-name()='bibitem'][not(@hidden = 'true')]"/>
                                            </xsl:if>

                                </fo:inline>
                            </fo:block>
                        </fo:list-item-label>
                        <fo:list-item-body start-indent="body-start()">
                            <fo:block xsl:use-attribute-sets="bibitem-non-normative-list-body-style">
                                <xsl:call-template name="processBibitem"/>
                            </fo:block>
                        </fo:list-item-body>
                    </fo:list-item>
                </fo:list-block>

    </xsl:template> <!-- references[not(@normative='true')]/bibitem -->

    <xsl:template name="processBibitem">

                <!-- start bibitem processing -->
                <xsl:if test=".//*[local-name() = 'fn']">
                    <xsl:attribute name="line-height-shift-adjustment">disregard-shifts</xsl:attribute>
                </xsl:if>

                <!-- display document identifier, not number [1] -->
                <xsl:variable name="docidentifier">
                    <xsl:choose>
                        <xsl:when test="*[local-name() = 'docidentifier']/@type = 'metanorma'"/>
                        <xsl:otherwise><xsl:value-of select="*[local-name() = 'docidentifier'][not(@type = 'metanorma-ordinal')]"/></xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <xsl:value-of select="$docidentifier"/>

                <xsl:apply-templates select="*[local-name() = 'note']"/>

                <xsl:if test="normalize-space($docidentifier) != '' and *[local-name() = 'formattedref']">

                    <xsl:text> </xsl:text>
                </xsl:if>

                <xsl:apply-templates select="*[local-name() = 'formattedref']"/>
                <!-- end bibitem processing -->

    </xsl:template> <!-- processBibitem (bibitem) -->

    <xsl:template name="processBibitemDocId">
        <xsl:variable name="_doc_ident" select="*[local-name() = 'docidentifier'][not(@type = 'DOI' or @type = 'metanorma' or @type = 'metanorma-ordinal' or @type = 'ISSN' or @type = 'ISBN' or @type = 'rfc-anchor')]"/>
        <xsl:choose>
            <xsl:when test="normalize-space($_doc_ident) != ''">
                <!-- <xsl:variable name="type" select="*[local-name() = 'docidentifier'][not(@type = 'DOI' or @type = 'metanorma' or @type = 'ISSN' or @type = 'ISBN' or @type = 'rfc-anchor')]/@type"/>
                <xsl:if test="$type != '' and not(contains($_doc_ident, $type))">
                    <xsl:value-of select="$type"/><xsl:text> </xsl:text>
                </xsl:if> -->
                <xsl:value-of select="$_doc_ident"/>
            </xsl:when>
            <xsl:otherwise>
                <!-- <xsl:variable name="type" select="*[local-name() = 'docidentifier'][not(@type = 'metanorma')]/@type"/>
                <xsl:if test="$type != ''">
                    <xsl:value-of select="$type"/><xsl:text> </xsl:text>
                </xsl:if> -->
                <xsl:value-of select="*[local-name() = 'docidentifier'][not(@type = 'metanorma') and not(@type = 'metanorma-ordinal')]"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- processBibitemDocId -->

    <xsl:template name="processPersonalAuthor">
        <xsl:choose>
            <xsl:when test="*[local-name() = 'name']/*[local-name() = 'completename']">
                <author>
                    <xsl:apply-templates select="*[local-name() = 'name']/*[local-name() = 'completename']"/>
                </author>
            </xsl:when>
            <xsl:when test="*[local-name() = 'name']/*[local-name() = 'surname'] and *[local-name() = 'name']/*[local-name() = 'initial']">
                <author>
                    <xsl:apply-templates select="*[local-name() = 'name']/*[local-name() = 'surname']"/>
                    <xsl:text> </xsl:text>
                    <xsl:apply-templates select="*[local-name() = 'name']/*[local-name() = 'initial']" mode="strip"/>
                </author>
            </xsl:when>
            <xsl:when test="*[local-name() = 'name']/*[local-name() = 'surname'] and *[local-name() = 'name']/*[local-name() = 'forename']">
                <author>
                    <xsl:apply-templates select="*[local-name() = 'name']/*[local-name() = 'surname']"/>
                    <xsl:text> </xsl:text>
                    <xsl:apply-templates select="*[local-name() = 'name']/*[local-name() = 'forename']" mode="strip"/>
                </author>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- processPersonalAuthor -->

    <xsl:template name="renderDate">
            <xsl:if test="normalize-space(*[local-name() = 'on']) != ''">
                <xsl:value-of select="*[local-name() = 'on']"/>
            </xsl:if>
            <xsl:if test="normalize-space(*[local-name() = 'from']) != ''">
                <xsl:value-of select="concat(*[local-name() = 'from'], '–', *[local-name() = 'to'])"/>
            </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'name']/*[local-name() = 'initial']/text()" mode="strip">
        <xsl:value-of select="translate(.,'. ','')"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'name']/*[local-name() = 'forename']/text()" mode="strip">
        <xsl:value-of select="substring(.,1,1)"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'title']" mode="title">
        <fo:inline><xsl:apply-templates/></fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'bibitem']/*[local-name() = 'title']" priority="2">
        <!-- <fo:inline><xsl:apply-templates /></fo:inline> -->
        <fo:inline font-style="italic"> <!-- BIPM BSI CSD CSA GB IEC IHO ISO ITU JCGM -->
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>

    <!-- bibitem/note renders as footnote -->
    <xsl:template match="*[local-name() = 'bibitem']/*[local-name() = 'note']" priority="2">

        <!-- list of footnotes to calculate actual footnotes number -->
        <xsl:variable name="p_fn_">
            <xsl:call-template name="get_fn_list"/>
        </xsl:variable>
        <xsl:variable name="p_fn" select="xalan:nodeset($p_fn_)"/>
        <xsl:variable name="gen_id" select="generate-id(.)"/>
        <xsl:variable name="lang" select="ancestor::*[contains(local-name(), '-standard')]/*[local-name()='bibdata']//*[local-name()='language'][@current = 'true']"/>
        <!-- fn sequence number in document -->
        <xsl:variable name="current_fn_number">
            <xsl:choose>
                <xsl:when test="@current_fn_number"><xsl:value-of select="@current_fn_number"/></xsl:when> <!-- for BSI -->
                <xsl:otherwise>
                    <!-- <xsl:value-of select="count($p_fn//fn[@reference = $reference]/preceding-sibling::fn) + 1" /> -->
                    <xsl:value-of select="count($p_fn//fn[@gen_id = $gen_id]/preceding-sibling::fn) + 1"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <fo:footnote>
            <xsl:variable name="number">

                        <xsl:value-of select="$current_fn_number"/>

            </xsl:variable>

            <xsl:variable name="current_fn_number_text">
                <xsl:value-of select="$number"/>

            </xsl:variable>

            <fo:inline xsl:use-attribute-sets="bibitem-note-fn-style">
                <fo:basic-link internal-destination="{$gen_id}" fox:alt-text="footnote {$number}">
                    <xsl:value-of select="$current_fn_number_text"/>
                </fo:basic-link>
            </fo:inline>
            <fo:footnote-body>
                <fo:block xsl:use-attribute-sets="bibitem-note-fn-body-style">
                    <fo:inline id="{$gen_id}" xsl:use-attribute-sets="bibitem-note-fn-number-style">
                        <xsl:value-of select="$current_fn_number_text"/>
                    </fo:inline>
                    <xsl:apply-templates/>
                </fo:block>
            </fo:footnote-body>
        </fo:footnote>
    </xsl:template>

    <xsl:template match="*[local-name() = 'bibitem']/*[local-name() = 'edition']"> <!-- for iho -->
        <xsl:text> edition </xsl:text>
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'bibitem']/*[local-name() = 'uri']"> <!-- for iho -->
        <xsl:text> (</xsl:text>
        <fo:inline xsl:use-attribute-sets="link-style">
            <fo:basic-link external-destination="." fox:alt-text=".">
                <xsl:value-of select="."/>
            </fo:basic-link>
        </fo:inline>
        <xsl:text>)</xsl:text>
    </xsl:template>

    <xsl:template match="*[local-name() = 'bibitem']/*[local-name() = 'docidentifier']"/>

    <xsl:template match="*[local-name() = 'formattedref']">

        <xsl:apply-templates/>
    </xsl:template>

    <!-- ======================= -->
    <!-- END Bibliography rendering -->
    <!-- ======================= -->

    <!-- ========================================================== -->
    <!-- END Reference sections (Normative References and Bibliography) -->
    <!-- ========================================================== -->

    <!-- =================== -->
    <!-- Form's elements processing -->
    <!-- =================== -->
    <xsl:template match="*[local-name() = 'form']">
        <fo:block>
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'form']//*[local-name() = 'label']">
        <fo:inline><xsl:apply-templates/></fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'form']//*[local-name() = 'input'][@type = 'text' or @type = 'date' or @type = 'file' or @type = 'password']">
        <fo:inline>
            <xsl:call-template name="text_input"/>
        </fo:inline>
    </xsl:template>

    <xsl:template name="text_input">
        <xsl:variable name="count">
            <xsl:choose>
                <xsl:when test="normalize-space(@maxlength) != ''"><xsl:value-of select="@maxlength"/></xsl:when>
                <xsl:when test="normalize-space(@size) != ''"><xsl:value-of select="@size"/></xsl:when>
                <xsl:otherwise>10</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:call-template name="repeat">
            <xsl:with-param name="char" select="'_'"/>
            <xsl:with-param name="count" select="$count"/>
        </xsl:call-template>
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="*[local-name() = 'form']//*[local-name() = 'input'][@type = 'button']">
        <xsl:variable name="caption">
            <xsl:choose>
                <xsl:when test="normalize-space(@value) != ''"><xsl:value-of select="@value"/></xsl:when>
                <xsl:otherwise>BUTTON</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <fo:inline>[<xsl:value-of select="$caption"/>]</fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'form']//*[local-name() = 'input'][@type = 'checkbox']">
        <fo:inline padding-right="1mm">
            <fo:instream-foreign-object fox:alt-text="Box" baseline-shift="-10%">
                <xsl:attribute name="height">3.5mm</xsl:attribute>
                <xsl:attribute name="content-width">100%</xsl:attribute>
                <xsl:attribute name="content-width">scale-down-to-fit</xsl:attribute>
                <xsl:attribute name="scaling">uniform</xsl:attribute>
                <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80">
                    <polyline points="0,0 80,0 80,80 0,80 0,0" stroke="black" stroke-width="5" fill="white"/>
                </svg>
            </fo:instream-foreign-object>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'form']//*[local-name() = 'input'][@type = 'radio']">
        <fo:inline padding-right="1mm">
            <fo:instream-foreign-object fox:alt-text="Box" baseline-shift="-10%">
                <xsl:attribute name="height">3.5mm</xsl:attribute>
                <xsl:attribute name="content-width">100%</xsl:attribute>
                <xsl:attribute name="content-width">scale-down-to-fit</xsl:attribute>
                <xsl:attribute name="scaling">uniform</xsl:attribute>
                <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80">
                    <circle cx="40" cy="40" r="30" stroke="black" stroke-width="5" fill="white"/>
                    <circle cx="40" cy="40" r="15" stroke="black" stroke-width="5" fill="white"/>
                </svg>
            </fo:instream-foreign-object>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'form']//*[local-name() = 'select']">
        <fo:inline>
            <xsl:call-template name="text_input"/>
        </fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'form']//*[local-name() = 'textarea']">
        <fo:block-container border="1pt solid black" width="50%">
            <fo:block> </fo:block>
        </fo:block-container>
    </xsl:template>

    <!-- =================== -->
    <!-- End Form's elements processing -->
    <!-- =================== -->

    <!-- =================== -->
    <!-- Table of Contents (ToC) processing -->
    <!-- =================== -->

    <xsl:variable name="toc_level">
        <!-- https://www.metanorma.org/author/ref/document-attributes/ -->
        <xsl:variable name="htmltoclevels" select="normalize-space(//*[local-name() = 'misc-container']/*[local-name() = 'presentation-metadata'][*[local-name() = 'name']/text() = 'HTML TOC Heading Levels']/*[local-name() = 'value'])"/> <!-- :htmltoclevels  Number of table of contents levels to render in HTML/PDF output; used to override :toclevels:-->
        <xsl:variable name="toclevels" select="normalize-space(//*[local-name() = 'misc-container']/*[local-name() = 'presentation-metadata'][*[local-name() = 'name']/text() = 'TOC Heading Levels']/*[local-name() = 'value'])"/> <!-- Number of table of contents levels to render -->
        <xsl:choose>
            <xsl:when test="$htmltoclevels != ''"><xsl:value-of select="number($htmltoclevels)"/></xsl:when> <!-- if there is value in xml -->
            <xsl:when test="$toclevels != ''"><xsl:value-of select="number($toclevels)"/></xsl:when>  <!-- if there is value in xml -->
            <xsl:otherwise><!-- default value -->
                2
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

    <xsl:template match="*[local-name() = 'toc']">
        <xsl:param name="colwidths"/>
        <xsl:variable name="colwidths_">
            <xsl:choose>
                <xsl:when test="not($colwidths)">
                    <xsl:variable name="toc_table_simple">
                        <tbody>
                            <xsl:apply-templates mode="toc_table_width"/>
                        </tbody>
                    </xsl:variable>
                    <xsl:variable name="cols-count" select="count(xalan:nodeset($toc_table_simple)/*/tr[1]/td)"/>
                    <xsl:call-template name="calculate-column-widths-proportional">
                        <xsl:with-param name="cols-count" select="$cols-count"/>
                        <xsl:with-param name="table" select="$toc_table_simple"/>
                    </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="$colwidths"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <fo:block role="TOCI" space-after="16pt">
            <fo:table width="100%" table-layout="fixed">
                <xsl:for-each select="xalan:nodeset($colwidths_)/column">
                    <fo:table-column column-width="proportional-column-width({.})"/>
                </xsl:for-each>
                <fo:table-body>
                    <xsl:apply-templates/>
                </fo:table-body>
            </fo:table>
        </fo:block>
    </xsl:template>

    <xsl:template match="*[local-name() = 'toc']//*[local-name() = 'li']" priority="2">
        <fo:table-row min-height="5mm">
            <xsl:apply-templates/>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="*[local-name() = 'toc']//*[local-name() = 'li']/*[local-name() = 'p']">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'toc']//*[local-name() = 'xref']" priority="3">
        <!-- <xref target="cgpm9th1948r6">1.6.3<tab/>&#8220;9th CGPM, 1948:<tab/>decision to establish the SI&#8221;</xref> -->
        <xsl:variable name="target" select="@target"/>
        <xsl:for-each select="*[local-name() = 'tab']">
            <xsl:variable name="current_id" select="generate-id()"/>
            <fo:table-cell>
                <fo:block>
                    <fo:basic-link internal-destination="{$target}" fox:alt-text="{.}">
                        <xsl:for-each select="following-sibling::node()[not(self::*[local-name() = 'tab']) and preceding-sibling::*[local-name() = 'tab'][1][generate-id() = $current_id]]">
                            <xsl:choose>
                                <xsl:when test="self::text()"><xsl:value-of select="."/></xsl:when>
                                <xsl:otherwise><xsl:apply-templates select="."/></xsl:otherwise>
                            </xsl:choose>
                        </xsl:for-each>
                    </fo:basic-link>
                </fo:block>
            </fo:table-cell>
        </xsl:for-each>
        <!-- last column - for page numbers -->
        <fo:table-cell text-align="right" font-size="10pt" font-weight="bold" font-family="Arial">
            <fo:block>
                <fo:basic-link internal-destination="{$target}" fox:alt-text="{.}">
                    <fo:page-number-citation ref-id="{$target}"/>
                </fo:basic-link>
            </fo:block>
        </fo:table-cell>
    </xsl:template>

    <!-- ================================== -->
    <!-- calculate ToC table columns widths -->
    <!-- ================================== -->
    <xsl:template match="*" mode="toc_table_width">
        <xsl:apply-templates mode="toc_table_width"/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'clause'][@type = 'toc']/*[local-name() = 'title']" mode="toc_table_width"/>
    <xsl:template match="*[local-name() = 'clause'][not(@type = 'toc')]/*[local-name() = 'title']" mode="toc_table_width"/>

    <xsl:template match="*[local-name() = 'li']" mode="toc_table_width">
        <tr>
            <xsl:apply-templates mode="toc_table_width"/>
        </tr>
    </xsl:template>

    <xsl:template match="*[local-name() = 'xref']" mode="toc_table_width">
        <!-- <xref target="cgpm9th1948r6">1.6.3<tab/>&#8220;9th CGPM, 1948:<tab/>decision to establish the SI&#8221;</xref> -->
        <xsl:for-each select="*[local-name() = 'tab']">
            <xsl:variable name="current_id" select="generate-id()"/>
            <td>
                <xsl:for-each select="following-sibling::node()[not(self::*[local-name() = 'tab']) and preceding-sibling::*[local-name() = 'tab'][1][generate-id() = $current_id]]">
                    <xsl:copy-of select="."/>
                </xsl:for-each>
            </td>
        </xsl:for-each>
        <td>333</td> <!-- page number, just for fill -->
    </xsl:template>

    <!-- ================================== -->
    <!-- END: calculate ToC table columns widths -->
    <!-- ================================== -->

    <!-- =================== -->
    <!-- End Table of Contents (ToC) processing -->
    <!-- =================== -->

    <xsl:template match="*[local-name() = 'variant-title']"/> <!-- [@type = 'sub'] -->
    <xsl:template match="*[local-name() = 'variant-title'][@type = 'sub']" mode="subtitle">
        <fo:inline padding-right="5mm"> </fo:inline>
        <fo:inline><xsl:apply-templates/></fo:inline>
    </xsl:template>

    <xsl:template match="*[local-name() = 'blacksquare']" name="blacksquare">
        <fo:inline padding-right="2.5mm" baseline-shift="5%">
            <fo:instream-foreign-object content-height="2mm" content-width="2mm" fox:alt-text="Quad">
                    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" viewBox="0 0 2 2">
                        <rect x="0" y="0" width="2" height="2" fill="black"/>
                    </svg>
                </fo:instream-foreign-object>
        </fo:inline>
    </xsl:template>

    <xsl:template match="@language">
        <xsl:copy-of select="."/>
    </xsl:template>

    <xsl:template match="*[local-name() = 'p'][@type = 'floating-title' or @type = 'section-title']" priority="4">
        <xsl:call-template name="title"/>
    </xsl:template>

    <!-- ================ -->
    <!-- Admonition -->
    <!-- ================ -->
    <xsl:template match="*[local-name() = 'admonition']">

                <fo:block xsl:use-attribute-sets="admonition-name-style">
                    <xsl:call-template name="displayAdmonitionName"/>
                </fo:block>
                <xsl:apply-templates select="node()[not(local-name() = 'name')]"/>

    </xsl:template>

    <xsl:template name="displayAdmonitionName">
        <xsl:param name="sep"/> <!-- Example: ' - ' -->
        <!-- <xsl:choose>
            <xsl:when test="$namespace = 'nist-cswp' or $namespace = 'nist-sp'">
                <xsl:choose>
                    <xsl:when test="@type='important'"><xsl:apply-templates select="@type"/></xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="*[local-name() = 'name']"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="*[local-name() = 'name']"/>
                <xsl:if test="not(*[local-name() = 'name'])">
                    <xsl:apply-templates select="@type"/>
                </xsl:if>
            </xsl:otherwise>
        </xsl:choose> -->
        <xsl:variable name="name">
            <xsl:apply-templates select="*[local-name() = 'name']"/>
        </xsl:variable>
        <xsl:copy-of select="$name"/>
        <xsl:if test="normalize-space($name) != ''">
            <xsl:value-of select="$sep"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="*[local-name() = 'admonition']/*[local-name() = 'name']">
        <xsl:apply-templates/>
    </xsl:template>

    <!-- <xsl:template match="*[local-name() = 'admonition']/@type">
        <xsl:variable name="admonition_type_">
            <xsl:call-template name="getLocalizedString">
                <xsl:with-param name="key">admonition.<xsl:value-of select="."/></xsl:with-param>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="admonition_type" select="normalize-space(java:toUpperCase(java:java.lang.String.new($admonition_type_)))"/>
        <xsl:value-of select="$admonition_type"/>
        <xsl:if test="$admonition_type = ''">
            <xsl:value-of select="java:toUpperCase(java:java.lang.String.new(.))"/>
        </xsl:if>
    </xsl:template> -->

    <xsl:template match="*[local-name() = 'admonition']/*[local-name() = 'p']">

                <fo:block xsl:use-attribute-sets="admonition-p-style">
                    <xsl:call-template name="paragraph"/>
                </fo:block>

    </xsl:template>

    <!-- ================ -->
    <!-- END Admonition -->
    <!-- ================ -->

    <!-- ===================================== -->
    <!-- Update xml -->
    <!-- ===================================== -->
    <!-- STEP1: Re-order elements in 'preface', 'sections' based on @displayorder -->
    <xsl:template match="@*|node()" mode="update_xml_step1">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="update_xml_step1"/>
        </xsl:copy>
    </xsl:template>

    <!-- change section's order based on @displayorder value -->
    <xsl:template match="*[local-name() = 'preface']" mode="update_xml_step1">
        <xsl:copy>
            <xsl:copy-of select="@*"/>

            <xsl:variable name="nodes_preface_">
                <xsl:for-each select="*">
                    <node id="{@id}"/>
                </xsl:for-each>
            </xsl:variable>
            <xsl:variable name="nodes_preface" select="xalan:nodeset($nodes_preface_)"/>

            <xsl:for-each select="*">
                <xsl:sort select="@displayorder" data-type="number"/>

                <!-- process Section's title -->
                <xsl:variable name="preceding-sibling_id" select="$nodes_preface/node[@id = current()/@id]/preceding-sibling::node[1]/@id"/>
                <xsl:if test="$preceding-sibling_id != ''">
                    <xsl:apply-templates select="parent::*/*[@type = 'section-title' and @id = $preceding-sibling_id and not(@displayorder)]" mode="update_xml_step1"/>
                </xsl:if>

                <xsl:choose>
                    <xsl:when test="@type = 'section-title' and not(@displayorder)"><!-- skip, don't copy, because copied in above 'apply-templates' --></xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="." mode="update_xml_step1"/>
                    </xsl:otherwise>
                </xsl:choose>

            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'sections']" mode="update_xml_step1">
        <xsl:copy>
            <xsl:copy-of select="@*"/>

            <xsl:variable name="nodes_sections_">
                <xsl:for-each select="*">
                    <node id="{@id}"/>
                </xsl:for-each>
            </xsl:variable>
            <xsl:variable name="nodes_sections" select="xalan:nodeset($nodes_sections_)"/>

            <!-- move section 'Normative references' inside 'sections' -->
            <xsl:for-each select="* |      ancestor::*[contains(local-name(), '-standard')]/*[local-name()='bibliography']/*[local-name()='references'][@normative='true'] |     ancestor::*[contains(local-name(), '-standard')]/*[local-name()='bibliography']/*[local-name()='clause'][*[local-name()='references'][@normative='true']]">
                <xsl:sort select="@displayorder" data-type="number"/>

                <!-- process Section's title -->
                <xsl:variable name="preceding-sibling_id" select="$nodes_sections/node[@id = current()/@id]/preceding-sibling::node[1]/@id"/>
                <xsl:if test="$preceding-sibling_id != ''">
                    <xsl:apply-templates select="parent::*/*[@type = 'section-title' and @id = $preceding-sibling_id and not(@displayorder)]" mode="update_xml_step1"/>
                </xsl:if>

                <xsl:choose>
                    <xsl:when test="@type = 'section-title' and not(@displayorder)"><!-- skip, don't copy, because copied in above 'apply-templates' --></xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="." mode="update_xml_step1"/>
                    </xsl:otherwise>
                </xsl:choose>

            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'bibliography']" mode="update_xml_step1">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <!-- copy all elements from bibliography except 'Normative references' (moved to 'sections') -->
            <xsl:for-each select="*[not(@normative='true') and not(*[@normative='true'])]">
                <xsl:sort select="@displayorder" data-type="number"/>
                <xsl:apply-templates select="." mode="update_xml_step1"/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name() = 'span'][@style]" mode="update_xml_step1" priority="2">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates mode="update_xml_step1"/>
        </xsl:copy>
    </xsl:template>
    <!-- Note: to enable the addition of character span markup with semantic styling for DIS Word output -->
    <xsl:template match="*[local-name() = 'span']" mode="update_xml_step1">
        <xsl:apply-templates mode="update_xml_step1"/>
    </xsl:template>

    <!-- END STEP1: Re-order elements in 'preface', 'sections' based on @displayorder -->

    <!-- XML UPDATE STEP: enclose standard's name into tag 'keep-together_within-line'  -->
    <!-- Example: <keep-together_within-line>ISO 10303-51</keep-together_within-line> -->
    <xsl:template match="@*|node()" mode="update_xml_enclose_keep-together_within-line">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="update_xml_enclose_keep-together_within-line"/>
        </xsl:copy>
    </xsl:template>

    <xsl:variable name="express_reference_separators">_.\</xsl:variable>
    <xsl:variable name="express_reference_characters" select="concat($upper,$lower,'1234567890',$express_reference_separators)"/>

    <xsl:variable name="element_name_keep-together_within-line">keep-together_within-line</xsl:variable>

    <xsl:template match="text()[not(ancestor::*[local-name() = 'bibdata'] or ancestor::*[local-name() = 'sourcecode'] or ancestor::*[local-name() = 'math'])]" name="keep_together_standard_number" mode="update_xml_enclose_keep-together_within-line">

        <!-- enclose standard's number into tag 'keep-together_within-line' -->
        <xsl:variable name="regex_standard_reference">([A-Z]{2,}(/[A-Z]{2,})* \d+(-\d+)*(:\d{4})?)</xsl:variable>
        <xsl:variable name="tag_keep-together_within-line_open">###<xsl:value-of select="$element_name_keep-together_within-line"/>###</xsl:variable>
        <xsl:variable name="tag_keep-together_within-line_close">###/<xsl:value-of select="$element_name_keep-together_within-line"/>###</xsl:variable>
        <xsl:variable name="text_" select="java:replaceAll(java:java.lang.String.new(.),$regex_standard_reference,concat($tag_keep-together_within-line_open,'$1',$tag_keep-together_within-line_close))"/>
        <xsl:variable name="text"><text><xsl:call-template name="replace_text_tags">
                <xsl:with-param name="tag_open" select="$tag_keep-together_within-line_open"/>
                <xsl:with-param name="tag_close" select="$tag_keep-together_within-line_close"/>
                <xsl:with-param name="text" select="$text_"/>
            </xsl:call-template></text></xsl:variable>

        <xsl:variable name="parent" select="local-name(..)"/>

        <xsl:variable name="text2">
            <text><xsl:for-each select="xalan:nodeset($text)/text/node()">
                    <xsl:copy-of select="."/>
                </xsl:for-each></text>
        </xsl:variable>

        <!-- keep-together_within-line for: a/b, aaa/b, a/bbb, /b -->
        <xsl:variable name="regex_solidus_units">((\b((\S{1,3}\/\S+)|(\S+\/\S{1,3}))\b)|(\/\S{1,3})\b)</xsl:variable>
        <xsl:variable name="text3">
            <text><xsl:for-each select="xalan:nodeset($text2)/text/node()">
                <xsl:choose>
                    <xsl:when test="self::text()">
                        <xsl:variable name="text_units_" select="java:replaceAll(java:java.lang.String.new(.),$regex_solidus_units,concat($tag_keep-together_within-line_open,'$1',$tag_keep-together_within-line_close))"/>
                        <xsl:variable name="text_units"><text><xsl:call-template name="replace_text_tags">
                            <xsl:with-param name="tag_open" select="$tag_keep-together_within-line_open"/>
                            <xsl:with-param name="tag_close" select="$tag_keep-together_within-line_close"/>
                            <xsl:with-param name="text" select="$text_units_"/>
                        </xsl:call-template></text></xsl:variable>
                        <xsl:copy-of select="xalan:nodeset($text_units)/text/node()"/>
                    </xsl:when>
                    <xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise> <!-- copy 'as-is' for <fo:inline keep-together.within-line="always" ...  -->
                </xsl:choose>
            </xsl:for-each></text>
        </xsl:variable>

        <xsl:choose>
            <xsl:when test="ancestor::*[local-name() = 'td' or local-name() = 'th']">
                <!-- keep-together_within-line for: a.b, aaa.b, a.bbb, .b  in table's cell ONLY -->
                <xsl:variable name="regex_dots_units">((\b((\S{1,3}\.\S+)|(\S+\.\S{1,3}))\b)|(\.\S{1,3})\b)</xsl:variable>
                <xsl:for-each select="xalan:nodeset($text3)/text/node()">
                    <xsl:choose>
                        <xsl:when test="self::text()">
                            <xsl:variable name="text_dots_" select="java:replaceAll(java:java.lang.String.new(.),$regex_dots_units,concat($tag_keep-together_within-line_open,'$1',$tag_keep-together_within-line_close))"/>
                            <xsl:variable name="text_dots"><text><xsl:call-template name="replace_text_tags">
                                <xsl:with-param name="tag_open" select="$tag_keep-together_within-line_open"/>
                                <xsl:with-param name="tag_close" select="$tag_keep-together_within-line_close"/>
                                <xsl:with-param name="text" select="$text_dots_"/>
                            </xsl:call-template></text></xsl:variable>
                            <xsl:copy-of select="xalan:nodeset($text_dots)/text/node()"/>
                        </xsl:when>
                        <xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise> <!-- copy 'as-is' for <fo:inline keep-together.within-line="always" ...  -->
                    </xsl:choose>
                </xsl:for-each>
            </xsl:when>
            <xsl:otherwise><xsl:copy-of select="xalan:nodeset($text3)/text/node()"/></xsl:otherwise>
        </xsl:choose>

    </xsl:template>

    <xsl:template name="replace_text_tags">
        <xsl:param name="tag_open"/>
        <xsl:param name="tag_close"/>
        <xsl:param name="text"/>
        <xsl:choose>
            <xsl:when test="contains($text, $tag_open)">
                <xsl:value-of select="substring-before($text, $tag_open)"/>
                <xsl:variable name="text_after" select="substring-after($text, $tag_open)"/>

                <xsl:element name="{substring-before(substring-after($tag_open, '###'),'###')}">
                    <xsl:value-of select="substring-before($text_after, $tag_close)"/>
                </xsl:element>

                <xsl:call-template name="replace_text_tags">
                    <xsl:with-param name="tag_open" select="$tag_open"/>
                    <xsl:with-param name="tag_close" select="$tag_close"/>
                    <xsl:with-param name="text" select="substring-after($text_after, $tag_close)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise><xsl:value-of select="$text"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- ===================================== -->
    <!-- End Update xml -->
    <!-- ===================================== -->

    <!-- for correct rendering combining chars -->
    <xsl:template match="*[local-name() = 'lang_none']">
        <fo:inline xml:lang="none"><xsl:value-of select="."/></fo:inline>
    </xsl:template>

    <xsl:template name="printEdition">
        <xsl:variable name="edition_i18n" select="normalize-space((//*[contains(local-name(), '-standard')])[1]/*[local-name() = 'bibdata']/*[local-name() = 'edition'][normalize-space(@language) != ''])"/>
        <xsl:text> </xsl:text>
        <xsl:choose>
            <xsl:when test="$edition_i18n != ''">
                <!-- Example: <edition language="fr">deuxième édition</edition> -->
                <xsl:call-template name="capitalize">
                    <xsl:with-param name="str" select="$edition_i18n"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="edition" select="normalize-space((//*[contains(local-name(), '-standard')])[1]/*[local-name() = 'bibdata']/*[local-name() = 'edition'])"/>
                <xsl:if test="$edition != ''"> <!-- Example: 1.3 -->
                    <xsl:call-template name="capitalize">
                        <xsl:with-param name="str">
                            <xsl:call-template name="getLocalizedString">
                                <xsl:with-param name="key">edition</xsl:with-param>
                            </xsl:call-template>
                        </xsl:with-param>
                    </xsl:call-template>
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="$edition"/>
                </xsl:if>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- convert YYYY-MM-DD to 'Month YYYY' or 'Month DD, YYYY' or DD Month YYYY -->
    <xsl:template name="convertDate">
        <xsl:param name="date"/>
        <xsl:param name="format" select="'short'"/>
        <xsl:variable name="year" select="substring($date, 1, 4)"/>
        <xsl:variable name="month" select="substring($date, 6, 2)"/>
        <xsl:variable name="day" select="substring($date, 9, 2)"/>
        <xsl:variable name="monthStr">
            <xsl:call-template name="getMonthByNum">
                <xsl:with-param name="num" select="$month"/>
                <xsl:with-param name="lowercase" select="'true'"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="monthStr_localized">
            <xsl:if test="normalize-space($monthStr) != ''"><xsl:call-template name="getLocalizedString"><xsl:with-param name="key">month_<xsl:value-of select="$monthStr"/></xsl:with-param></xsl:call-template></xsl:if>
        </xsl:variable>
        <xsl:variable name="result">
            <xsl:choose>
                <xsl:when test="$format = 'ddMMyyyy'"> <!-- convert date from format 2007-04-01 to 1 April 2007 -->
                    <xsl:if test="$day != ''"><xsl:value-of select="number($day)"/></xsl:if>
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="normalize-space(concat($monthStr_localized, ' ' , $year))"/>
                </xsl:when>
                <xsl:when test="$format = 'ddMM'">
                    <xsl:if test="$day != ''"><xsl:value-of select="number($day)"/></xsl:if>
                    <xsl:text> </xsl:text><xsl:value-of select="$monthStr_localized"/>
                </xsl:when>
                <xsl:when test="$format = 'short' or $day = ''">
                    <xsl:value-of select="normalize-space(concat($monthStr_localized, ' ', $year))"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="normalize-space(concat($monthStr_localized, ' ', $day, ', ' , $year))"/> <!-- January 01, 2022 -->
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:value-of select="$result"/>
    </xsl:template> <!-- convertDate -->

    <!-- return Month's name by number -->
    <xsl:template name="getMonthByNum">
        <xsl:param name="num"/>
        <xsl:param name="lang">en</xsl:param>
        <xsl:param name="lowercase">false</xsl:param> <!-- return 'january' instead of 'January' -->
        <xsl:variable name="monthStr_">
            <xsl:choose>
                <xsl:when test="$lang = 'fr'">
                    <xsl:choose>
                        <xsl:when test="$num = '01'">Janvier</xsl:when>
                        <xsl:when test="$num = '02'">Février</xsl:when>
                        <xsl:when test="$num = '03'">Mars</xsl:when>
                        <xsl:when test="$num = '04'">Avril</xsl:when>
                        <xsl:when test="$num = '05'">Mai</xsl:when>
                        <xsl:when test="$num = '06'">Juin</xsl:when>
                        <xsl:when test="$num = '07'">Juillet</xsl:when>
                        <xsl:when test="$num = '08'">Août</xsl:when>
                        <xsl:when test="$num = '09'">Septembre</xsl:when>
                        <xsl:when test="$num = '10'">Octobre</xsl:when>
                        <xsl:when test="$num = '11'">Novembre</xsl:when>
                        <xsl:when test="$num = '12'">Décembre</xsl:when>
                    </xsl:choose>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:choose>
                        <xsl:when test="$num = '01'">January</xsl:when>
                        <xsl:when test="$num = '02'">February</xsl:when>
                        <xsl:when test="$num = '03'">March</xsl:when>
                        <xsl:when test="$num = '04'">April</xsl:when>
                        <xsl:when test="$num = '05'">May</xsl:when>
                        <xsl:when test="$num = '06'">June</xsl:when>
                        <xsl:when test="$num = '07'">July</xsl:when>
                        <xsl:when test="$num = '08'">August</xsl:when>
                        <xsl:when test="$num = '09'">September</xsl:when>
                        <xsl:when test="$num = '10'">October</xsl:when>
                        <xsl:when test="$num = '11'">November</xsl:when>
                        <xsl:when test="$num = '12'">December</xsl:when>
                    </xsl:choose>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="normalize-space($lowercase) = 'true'">
                <xsl:value-of select="java:toLowerCase(java:java.lang.String.new($monthStr_))"/>
            </xsl:when>
            <xsl:otherwise><xsl:value-of select="$monthStr_"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- getMonthByNum -->

    <!-- return Month's name by number from localized strings -->
    <xsl:template name="getMonthLocalizedByNum">
        <xsl:param name="num"/>
        <xsl:variable name="monthStr">
            <xsl:choose>
                <xsl:when test="$num = '01'">january</xsl:when>
                <xsl:when test="$num = '02'">february</xsl:when>
                <xsl:when test="$num = '03'">march</xsl:when>
                <xsl:when test="$num = '04'">april</xsl:when>
                <xsl:when test="$num = '05'">may</xsl:when>
                <xsl:when test="$num = '06'">june</xsl:when>
                <xsl:when test="$num = '07'">july</xsl:when>
                <xsl:when test="$num = '08'">august</xsl:when>
                <xsl:when test="$num = '09'">september</xsl:when>
                <xsl:when test="$num = '10'">october</xsl:when>
                <xsl:when test="$num = '11'">november</xsl:when>
                <xsl:when test="$num = '12'">december</xsl:when>
            </xsl:choose>
        </xsl:variable>
        <xsl:call-template name="getLocalizedString">
            <xsl:with-param name="key">month_<xsl:value-of select="$monthStr"/></xsl:with-param>
        </xsl:call-template>
    </xsl:template> <!-- getMonthLocalizedByNum -->

    <xsl:template name="insertKeywords">
        <xsl:param name="sorting" select="'true'"/>
        <xsl:param name="meta" select="'false'"/>
        <xsl:param name="charAtEnd" select="'.'"/>
        <xsl:param name="charDelim" select="', '"/>
        <xsl:choose>
            <xsl:when test="$sorting = 'true' or $sorting = 'yes'">
                <xsl:for-each select="//*[contains(local-name(), '-standard')]/*[local-name() = 'bibdata']//*[local-name() = 'keyword']">
                    <xsl:sort data-type="text" order="ascending"/>
                    <xsl:call-template name="insertKeyword">
                        <xsl:with-param name="meta" select="$meta"/>
                        <xsl:with-param name="charAtEnd" select="$charAtEnd"/>
                        <xsl:with-param name="charDelim" select="$charDelim"/>
                    </xsl:call-template>
                </xsl:for-each>
            </xsl:when>
            <xsl:otherwise>
                <xsl:for-each select="//*[contains(local-name(), '-standard')]/*[local-name() = 'bibdata']//*[local-name() = 'keyword']">
                    <xsl:call-template name="insertKeyword">
                        <xsl:with-param name="meta" select="$meta"/>
                        <xsl:with-param name="charAtEnd" select="$charAtEnd"/>
                        <xsl:with-param name="charDelim" select="$charDelim"/>
                    </xsl:call-template>
                </xsl:for-each>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="insertKeyword">
        <xsl:param name="charAtEnd"/>
        <xsl:param name="charDelim"/>
        <xsl:param name="meta"/>
        <xsl:choose>
            <xsl:when test="$meta = 'true'">
                <xsl:value-of select="."/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates/>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:choose>
            <xsl:when test="position() != last()"><xsl:value-of select="$charDelim"/></xsl:when>
            <xsl:otherwise><xsl:value-of select="$charAtEnd"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="addPDFUAmeta">
        <pdf:catalog xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf">
                <pdf:dictionary type="normal" key="ViewerPreferences">
                    <pdf:boolean key="DisplayDocTitle">true</pdf:boolean>
                </pdf:dictionary>
            </pdf:catalog>
        <x:xmpmeta xmlns:x="adobe:ns:meta/">
            <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
                <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" rdf:about="">
                <!-- Dublin Core properties go here -->
                    <dc:title>
                        <xsl:variable name="title">
                            <xsl:for-each select="(//*[contains(local-name(), '-standard')])[1]/*[local-name() = 'bibdata']">

                                        <xsl:value-of select="*[local-name() = 'title'][@language = $lang and @type = 'main']"/>

                            </xsl:for-each>
                        </xsl:variable>
                        <xsl:choose>
                            <xsl:when test="normalize-space($title) != ''">
                                <xsl:value-of select="$title"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:text> </xsl:text>
                            </xsl:otherwise>
                        </xsl:choose>
                    </dc:title>
                    <dc:creator>
                        <xsl:for-each select="(//*[contains(local-name(), '-standard')])[1]/*[local-name() = 'bibdata']">

                                    <xsl:for-each select="*[local-name() = 'contributor'][*[local-name() = 'role']/@type='author']">
                                        <xsl:value-of select="*[local-name() = 'organization']/*[local-name() = 'name']"/>
                                        <xsl:if test="position() != last()">; </xsl:if>
                                    </xsl:for-each>

                        </xsl:for-each>
                    </dc:creator>
                    <dc:description>
                        <xsl:variable name="abstract">

                                    <xsl:copy-of select="//*[contains(local-name(), '-standard')]/*[local-name() = 'preface']/*[local-name() = 'abstract']//text()[not(ancestor::*[local-name() = 'title'])]"/>

                        </xsl:variable>
                        <xsl:value-of select="normalize-space($abstract)"/>
                    </dc:description>
                    <pdf:Keywords>
                        <xsl:call-template name="insertKeywords">
                            <xsl:with-param name="meta">true</xsl:with-param>
                        </xsl:call-template>
                    </pdf:Keywords>
                </rdf:Description>
                <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" rdf:about="">
                    <!-- XMP properties go here -->
                    <xmp:CreatorTool/>
                </rdf:Description>
            </rdf:RDF>
        </x:xmpmeta>
    </xsl:template> <!-- addPDFUAmeta -->

    <xsl:template name="getId">
        <xsl:choose>
            <xsl:when test="../@id">
                <xsl:value-of select="../@id"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat(generate-id(..), '_', text())"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- Get or calculate depth of the element -->
    <xsl:template name="getLevel">
        <xsl:param name="depth"/>
        <xsl:choose>
            <xsl:when test="normalize-space(@depth) != ''">
                <xsl:value-of select="@depth"/>
            </xsl:when>
            <xsl:when test="normalize-space($depth) != ''">
                <xsl:value-of select="$depth"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="level_total" select="count(ancestor::*)"/>
                <xsl:variable name="level">
                    <xsl:choose>
                        <xsl:when test="parent::*[local-name() = 'preface']">
                            <xsl:value-of select="$level_total - 1"/>
                        </xsl:when>
                        <xsl:when test="ancestor::*[local-name() = 'preface'] and not(ancestor::*[local-name() = 'foreword']) and not(ancestor::*[local-name() = 'introduction'])"> <!-- for preface/clause -->
                            <xsl:value-of select="$level_total - 1"/>
                        </xsl:when>
                        <xsl:when test="ancestor::*[local-name() = 'preface']">
                            <xsl:value-of select="$level_total - 2"/>
                        </xsl:when>
                        <xsl:when test="ancestor::*[local-name() = 'sections']">
                            <xsl:value-of select="$level_total - 1"/>
                        </xsl:when>
                        <xsl:when test="ancestor::*[local-name() = 'bibliography']">
                            <xsl:value-of select="$level_total - 1"/>
                        </xsl:when>
                        <xsl:when test="parent::*[local-name() = 'annex']">
                            <xsl:value-of select="$level_total - 1"/>
                        </xsl:when>
                        <xsl:when test="ancestor::*[local-name() = 'annex']">
                            <xsl:value-of select="$level_total"/>
                        </xsl:when>
                        <xsl:when test="local-name() = 'annex'">1</xsl:when>
                        <xsl:when test="local-name(ancestor::*[1]) = 'annex'">1</xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="$level_total - 1"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <xsl:value-of select="$level"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- getLevel -->

    <!-- Get or calculate depth of term's name -->
    <xsl:template name="getLevelTermName">
        <xsl:choose>
            <xsl:when test="normalize-space(../@depth) != ''">
                <xsl:value-of select="../@depth"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="title_level_">
                    <xsl:for-each select="../preceding-sibling::*[local-name() = 'title'][1]">
                        <xsl:call-template name="getLevel"/>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:variable name="title_level" select="normalize-space($title_level_)"/>
                <xsl:choose>
                    <xsl:when test="$title_level != ''"><xsl:value-of select="$title_level + 1"/></xsl:when>
                    <xsl:otherwise>
                        <xsl:call-template name="getLevel"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- getLevelTermName -->

    <!-- split string by separator -->
    <xsl:template name="split">
        <xsl:param name="pText" select="."/>
        <xsl:param name="sep" select="','"/>
        <xsl:param name="normalize-space" select="'true'"/>
        <xsl:param name="keep_sep" select="'false'"/>
        <xsl:if test="string-length($pText) &gt;0">
            <item>
                <xsl:choose>
                    <xsl:when test="$normalize-space = 'true'">
                        <xsl:value-of select="normalize-space(substring-before(concat($pText, $sep), $sep))"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="substring-before(concat($pText, $sep), $sep)"/>
                    </xsl:otherwise>
                </xsl:choose>
            </item>
            <xsl:if test="$keep_sep = 'true' and contains($pText, $sep)"><item><xsl:value-of select="$sep"/></item></xsl:if>
            <xsl:call-template name="split">
                <xsl:with-param name="pText" select="substring-after($pText, $sep)"/>
                <xsl:with-param name="sep" select="$sep"/>
                <xsl:with-param name="normalize-space" select="$normalize-space"/>
                <xsl:with-param name="keep_sep" select="$keep_sep"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template> <!-- split -->

    <xsl:template name="getDocumentId">
        <xsl:call-template name="getLang"/><xsl:value-of select="//*[local-name() = 'p'][1]/@id"/>
    </xsl:template>

    <xsl:template name="namespaceCheck">
        <xsl:variable name="documentNS" select="namespace-uri(/*)"/>
        <xsl:variable name="XSLNS">

                <xsl:value-of select="document('')//*/namespace::gb"/>

        </xsl:variable>
        <xsl:if test="$documentNS != $XSLNS">
            <xsl:message>[WARNING]: Document namespace: '<xsl:value-of select="$documentNS"/>' doesn't equal to xslt namespace '<xsl:value-of select="$XSLNS"/>'</xsl:message>
        </xsl:if>
    </xsl:template> <!-- namespaceCheck -->

    <xsl:template name="getLanguage">
        <xsl:param name="lang"/>
        <xsl:variable name="language" select="java:toLowerCase(java:java.lang.String.new($lang))"/>
        <xsl:choose>
            <xsl:when test="$language = 'en'">English</xsl:when>
            <xsl:when test="$language = 'fr'">French</xsl:when>
            <xsl:when test="$language = 'de'">Deutsch</xsl:when>
            <xsl:when test="$language = 'cn'">Chinese</xsl:when>
            <xsl:otherwise><xsl:value-of select="$language"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="setId">
        <xsl:attribute name="id">
            <xsl:choose>
                <xsl:when test="@id">
                    <xsl:value-of select="@id"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="generate-id()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
    </xsl:template>

    <xsl:template name="add-letter-spacing">
        <xsl:param name="text"/>
        <xsl:param name="letter-spacing" select="'0.15'"/>
        <xsl:if test="string-length($text) &gt; 0">
            <xsl:variable name="char" select="substring($text, 1, 1)"/>
            <fo:inline padding-right="{$letter-spacing}mm">
                <xsl:if test="$char = '®'">
                    <xsl:attribute name="font-size">58%</xsl:attribute>
                    <xsl:attribute name="baseline-shift">30%</xsl:attribute>
                </xsl:if>
                <xsl:value-of select="$char"/>
            </fo:inline>
            <xsl:call-template name="add-letter-spacing">
                <xsl:with-param name="text" select="substring($text, 2)"/>
                <xsl:with-param name="letter-spacing" select="$letter-spacing"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template name="repeat">
        <xsl:param name="char" select="'*'"/>
        <xsl:param name="count"/>
        <xsl:if test="$count &gt; 0">
            <xsl:value-of select="$char"/>
            <xsl:call-template name="repeat">
                <xsl:with-param name="char" select="$char"/>
                <xsl:with-param name="count" select="$count - 1"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template name="getLocalizedString">
        <xsl:param name="key"/>
        <xsl:param name="formatted">false</xsl:param>
        <xsl:param name="lang"/>
        <xsl:param name="returnEmptyIfNotFound">false</xsl:param>

        <xsl:variable name="curr_lang">
            <xsl:choose>
                <xsl:when test="$lang != ''"><xsl:value-of select="$lang"/></xsl:when>
                <xsl:when test="$returnEmptyIfNotFound = 'true'"/>
                <xsl:otherwise>
                    <xsl:call-template name="getLang"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="data_value">
            <xsl:choose>
                <xsl:when test="$formatted = 'true'">
                    <xsl:apply-templates select="xalan:nodeset($bibdata)//*[local-name() = 'localized-string'][@key = $key and @language = $curr_lang]"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="normalize-space(xalan:nodeset($bibdata)//*[local-name() = 'localized-string'][@key = $key and @language = $curr_lang])"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:choose>
            <xsl:when test="normalize-space($data_value) != ''">
                <xsl:choose>
                    <xsl:when test="$formatted = 'true'"><xsl:copy-of select="$data_value"/></xsl:when>
                    <xsl:otherwise><xsl:value-of select="$data_value"/></xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:when test="/*/*[local-name() = 'localized-strings']/*[local-name() = 'localized-string'][@key = $key and @language = $curr_lang]">
                <xsl:choose>
                    <xsl:when test="$formatted = 'true'">
                        <xsl:apply-templates select="/*/*[local-name() = 'localized-strings']/*[local-name() = 'localized-string'][@key = $key and @language = $curr_lang]"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="/*/*[local-name() = 'localized-strings']/*[local-name() = 'localized-string'][@key = $key and @language = $curr_lang]"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:when test="$returnEmptyIfNotFound = 'true'"/>
            <xsl:otherwise>
                <xsl:variable name="key_">
                    <xsl:call-template name="capitalize">
                        <xsl:with-param name="str" select="translate($key, '_', ' ')"/>
                    </xsl:call-template>
                </xsl:variable>
                <xsl:value-of select="$key_"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- getLocalizedString -->

    <xsl:template name="setTrackChangesStyles">
        <xsl:param name="isAdded"/>
        <xsl:param name="isDeleted"/>
        <xsl:choose>
            <xsl:when test="local-name() = 'math'">
                <xsl:if test="$isAdded = 'true'">
                    <xsl:attribute name="background-color"><xsl:value-of select="$color-added-text"/></xsl:attribute>
                </xsl:if>
                <xsl:if test="$isDeleted = 'true'">
                    <xsl:attribute name="background-color"><xsl:value-of select="$color-deleted-text"/></xsl:attribute>
                </xsl:if>
            </xsl:when>
            <xsl:otherwise>
                <xsl:if test="$isAdded = 'true'">
                    <xsl:attribute name="border"><xsl:value-of select="$border-block-added"/></xsl:attribute>
                    <xsl:attribute name="padding">2mm</xsl:attribute>
                </xsl:if>
                <xsl:if test="$isDeleted = 'true'">
                    <xsl:attribute name="border"><xsl:value-of select="$border-block-deleted"/></xsl:attribute>
                    <xsl:if test="local-name() = 'table'">
                        <xsl:attribute name="background-color">rgb(255, 185, 185)</xsl:attribute>
                    </xsl:if>
                    <xsl:attribute name="padding">2mm</xsl:attribute>
                </xsl:if>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- setTrackChangesStyles -->

    <!--  see https://xmlgraphics.apache.org/fop/2.5/complexscripts.html#bidi_controls-->
    <xsl:variable name="LRM" select="'‎'"/> <!-- U+200E - LEFT-TO-RIGHT MARK (LRM) -->
    <xsl:variable name="RLM" select="'‏'"/> <!-- U+200F - RIGHT-TO-LEFT MARK (RLM) -->
    <xsl:template name="setWritingMode">
        <xsl:if test="$lang = 'ar'">
            <xsl:attribute name="writing-mode">rl-tb</xsl:attribute>
        </xsl:if>
    </xsl:template>

    <xsl:template name="setAlignment">
        <xsl:param name="align" select="normalize-space(@align)"/>
        <xsl:choose>
            <xsl:when test="$lang = 'ar' and $align = 'left'">start</xsl:when>
            <xsl:when test="$lang = 'ar' and $align = 'right'">end</xsl:when>
            <xsl:when test="$align != ''">
                <xsl:value-of select="$align"/>
            </xsl:when>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="setTextAlignment">
        <xsl:param name="default">left</xsl:param>
        <xsl:variable name="align" select="normalize-space(@align)"/>
        <xsl:attribute name="text-align">
            <xsl:choose>
                <xsl:when test="$lang = 'ar' and $align = 'left'">start</xsl:when>
                <xsl:when test="$lang = 'ar' and $align = 'right'">end</xsl:when>
                <xsl:when test="$align != '' and not($align = 'indent')"><xsl:value-of select="$align"/></xsl:when>
                <xsl:when test="ancestor::*[local-name() = 'td']/@align"><xsl:value-of select="ancestor::*[local-name() = 'td']/@align"/></xsl:when>
                <xsl:when test="ancestor::*[local-name() = 'th']/@align"><xsl:value-of select="ancestor::*[local-name() = 'th']/@align"/></xsl:when>
                <xsl:otherwise><xsl:value-of select="$default"/></xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
        <xsl:if test="$align = 'indent'">
            <xsl:attribute name="margin-left">7mm</xsl:attribute>
        </xsl:if>
    </xsl:template>

    <xsl:template name="number-to-words">
        <xsl:param name="number"/>
        <xsl:param name="first"/>
        <xsl:if test="$number != ''">
            <xsl:variable name="words">
                <words>
                    <xsl:choose>
                        <xsl:when test="$lang = 'fr'"> <!-- https://en.wiktionary.org/wiki/Appendix:French_numbers -->
                            <word cardinal="1">Une-</word>
                            <word ordinal="1">Première </word>
                            <word cardinal="2">Deux-</word>
                            <word ordinal="2">Seconde </word>
                            <word cardinal="3">Trois-</word>
                            <word ordinal="3">Tierce </word>
                            <word cardinal="4">Quatre-</word>
                            <word ordinal="4">Quatrième </word>
                            <word cardinal="5">Cinq-</word>
                            <word ordinal="5">Cinquième </word>
                            <word cardinal="6">Six-</word>
                            <word ordinal="6">Sixième </word>
                            <word cardinal="7">Sept-</word>
                            <word ordinal="7">Septième </word>
                            <word cardinal="8">Huit-</word>
                            <word ordinal="8">Huitième </word>
                            <word cardinal="9">Neuf-</word>
                            <word ordinal="9">Neuvième </word>
                            <word ordinal="10">Dixième </word>
                            <word ordinal="11">Onzième </word>
                            <word ordinal="12">Douzième </word>
                            <word ordinal="13">Treizième </word>
                            <word ordinal="14">Quatorzième </word>
                            <word ordinal="15">Quinzième </word>
                            <word ordinal="16">Seizième </word>
                            <word ordinal="17">Dix-septième </word>
                            <word ordinal="18">Dix-huitième </word>
                            <word ordinal="19">Dix-neuvième </word>
                            <word cardinal="20">Vingt-</word>
                            <word ordinal="20">Vingtième </word>
                            <word cardinal="30">Trente-</word>
                            <word ordinal="30">Trentième </word>
                            <word cardinal="40">Quarante-</word>
                            <word ordinal="40">Quarantième </word>
                            <word cardinal="50">Cinquante-</word>
                            <word ordinal="50">Cinquantième </word>
                            <word cardinal="60">Soixante-</word>
                            <word ordinal="60">Soixantième </word>
                            <word cardinal="70">Septante-</word>
                            <word ordinal="70">Septantième </word>
                            <word cardinal="80">Huitante-</word>
                            <word ordinal="80">Huitantième </word>
                            <word cardinal="90">Nonante-</word>
                            <word ordinal="90">Nonantième </word>
                            <word cardinal="100">Cent-</word>
                            <word ordinal="100">Centième </word>
                        </xsl:when>
                        <xsl:when test="$lang = 'ru'">
                            <word cardinal="1">Одна-</word>
                            <word ordinal="1">Первое </word>
                            <word cardinal="2">Две-</word>
                            <word ordinal="2">Второе </word>
                            <word cardinal="3">Три-</word>
                            <word ordinal="3">Третье </word>
                            <word cardinal="4">Четыре-</word>
                            <word ordinal="4">Четвертое </word>
                            <word cardinal="5">Пять-</word>
                            <word ordinal="5">Пятое </word>
                            <word cardinal="6">Шесть-</word>
                            <word ordinal="6">Шестое </word>
                            <word cardinal="7">Семь-</word>
                            <word ordinal="7">Седьмое </word>
                            <word cardinal="8">Восемь-</word>
                            <word ordinal="8">Восьмое </word>
                            <word cardinal="9">Девять-</word>
                            <word ordinal="9">Девятое </word>
                            <word ordinal="10">Десятое </word>
                            <word ordinal="11">Одиннадцатое </word>
                            <word ordinal="12">Двенадцатое </word>
                            <word ordinal="13">Тринадцатое </word>
                            <word ordinal="14">Четырнадцатое </word>
                            <word ordinal="15">Пятнадцатое </word>
                            <word ordinal="16">Шестнадцатое </word>
                            <word ordinal="17">Семнадцатое </word>
                            <word ordinal="18">Восемнадцатое </word>
                            <word ordinal="19">Девятнадцатое </word>
                            <word cardinal="20">Двадцать-</word>
                            <word ordinal="20">Двадцатое </word>
                            <word cardinal="30">Тридцать-</word>
                            <word ordinal="30">Тридцатое </word>
                            <word cardinal="40">Сорок-</word>
                            <word ordinal="40">Сороковое </word>
                            <word cardinal="50">Пятьдесят-</word>
                            <word ordinal="50">Пятидесятое </word>
                            <word cardinal="60">Шестьдесят-</word>
                            <word ordinal="60">Шестидесятое </word>
                            <word cardinal="70">Семьдесят-</word>
                            <word ordinal="70">Семидесятое </word>
                            <word cardinal="80">Восемьдесят-</word>
                            <word ordinal="80">Восьмидесятое </word>
                            <word cardinal="90">Девяносто-</word>
                            <word ordinal="90">Девяностое </word>
                            <word cardinal="100">Сто-</word>
                            <word ordinal="100">Сотое </word>
                        </xsl:when>
                        <xsl:otherwise> <!-- default english -->
                            <word cardinal="1">One-</word>
                            <word ordinal="1">First </word>
                            <word cardinal="2">Two-</word>
                            <word ordinal="2">Second </word>
                            <word cardinal="3">Three-</word>
                            <word ordinal="3">Third </word>
                            <word cardinal="4">Four-</word>
                            <word ordinal="4">Fourth </word>
                            <word cardinal="5">Five-</word>
                            <word ordinal="5">Fifth </word>
                            <word cardinal="6">Six-</word>
                            <word ordinal="6">Sixth </word>
                            <word cardinal="7">Seven-</word>
                            <word ordinal="7">Seventh </word>
                            <word cardinal="8">Eight-</word>
                            <word ordinal="8">Eighth </word>
                            <word cardinal="9">Nine-</word>
                            <word ordinal="9">Ninth </word>
                            <word ordinal="10">Tenth </word>
                            <word ordinal="11">Eleventh </word>
                            <word ordinal="12">Twelfth </word>
                            <word ordinal="13">Thirteenth </word>
                            <word ordinal="14">Fourteenth </word>
                            <word ordinal="15">Fifteenth </word>
                            <word ordinal="16">Sixteenth </word>
                            <word ordinal="17">Seventeenth </word>
                            <word ordinal="18">Eighteenth </word>
                            <word ordinal="19">Nineteenth </word>
                            <word cardinal="20">Twenty-</word>
                            <word ordinal="20">Twentieth </word>
                            <word cardinal="30">Thirty-</word>
                            <word ordinal="30">Thirtieth </word>
                            <word cardinal="40">Forty-</word>
                            <word ordinal="40">Fortieth </word>
                            <word cardinal="50">Fifty-</word>
                            <word ordinal="50">Fiftieth </word>
                            <word cardinal="60">Sixty-</word>
                            <word ordinal="60">Sixtieth </word>
                            <word cardinal="70">Seventy-</word>
                            <word ordinal="70">Seventieth </word>
                            <word cardinal="80">Eighty-</word>
                            <word ordinal="80">Eightieth </word>
                            <word cardinal="90">Ninety-</word>
                            <word ordinal="90">Ninetieth </word>
                            <word cardinal="100">Hundred-</word>
                            <word ordinal="100">Hundredth </word>
                        </xsl:otherwise>
                    </xsl:choose>
                </words>
            </xsl:variable>

            <xsl:variable name="ordinal" select="xalan:nodeset($words)//word[@ordinal = $number]/text()"/>

            <xsl:variable name="value">
                <xsl:choose>
                    <xsl:when test="$ordinal != ''">
                        <xsl:value-of select="$ordinal"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:choose>
                            <xsl:when test="$number &lt; 100">
                                <xsl:variable name="decade" select="concat(substring($number,1,1), '0')"/>
                                <xsl:variable name="digit" select="substring($number,2)"/>
                                <xsl:value-of select="xalan:nodeset($words)//word[@cardinal = $decade]/text()"/>
                                <xsl:value-of select="xalan:nodeset($words)//word[@ordinal = $digit]/text()"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <!-- more 100 -->
                                <xsl:variable name="hundred" select="substring($number,1,1)"/>
                                <xsl:variable name="digits" select="number(substring($number,2))"/>
                                <xsl:value-of select="xalan:nodeset($words)//word[@cardinal = $hundred]/text()"/>
                                <xsl:value-of select="xalan:nodeset($words)//word[@cardinal = '100']/text()"/>
                                <xsl:call-template name="number-to-words">
                                    <xsl:with-param name="number" select="$digits"/>
                                </xsl:call-template>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            <xsl:choose>
                <xsl:when test="$first = 'true'">
                    <xsl:variable name="value_lc" select="java:toLowerCase(java:java.lang.String.new($value))"/>
                    <xsl:call-template name="capitalize">
                        <xsl:with-param name="str" select="$value_lc"/>
                    </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$value"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:if>
    </xsl:template> <!-- number-to-words -->

    <!-- st for 1, nd for 2, rd for 3, th for 4, 5, 6, ... -->
    <xsl:template name="number-to-ordinal">
        <xsl:param name="number"/>
        <xsl:param name="curr_lang"/>
        <xsl:choose>
            <xsl:when test="$curr_lang = 'fr'">
                <xsl:choose>
                    <xsl:when test="$number = '1'">re</xsl:when>
                    <xsl:otherwise>e</xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise>
                <xsl:choose>
                    <xsl:when test="$number = 1">st</xsl:when>
                    <xsl:when test="$number = 2">nd</xsl:when>
                    <xsl:when test="$number = 3">rd</xsl:when>
                    <xsl:otherwise>th</xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> <!-- number-to-ordinal -->

    <!-- add the attribute fox:alt-text, required for PDF/UA -->
    <xsl:template name="setAltText">
        <xsl:param name="value"/>
        <xsl:attribute name="fox:alt-text">
            <xsl:choose>
                <xsl:when test="normalize-space($value) != ''">
                    <xsl:value-of select="$value"/>
                </xsl:when>
                <xsl:otherwise>_</xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
    </xsl:template>

    <xsl:template name="substring-after-last">
        <xsl:param name="value"/>
        <xsl:param name="delimiter"/>
        <xsl:choose>
            <xsl:when test="contains($value, $delimiter)">
                <xsl:call-template name="substring-after-last">
                    <xsl:with-param name="value" select="substring-after($value, $delimiter)"/>
                    <xsl:with-param name="delimiter" select="$delimiter"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$value"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="*" mode="print_as_xml">
        <xsl:param name="level">0</xsl:param>

        <fo:block margin-left="{2*$level}mm">
            <xsl:text>
&lt;</xsl:text>
            <xsl:value-of select="local-name()"/>
            <xsl:for-each select="@*">
                <xsl:text> </xsl:text>
                <xsl:value-of select="local-name()"/>
                <xsl:text>="</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text>"</xsl:text>
            </xsl:for-each>
            <xsl:text>&gt;</xsl:text>

            <xsl:if test="not(*)">
                <fo:inline font-weight="bold"><xsl:value-of select="."/></fo:inline>
                <xsl:text>&lt;/</xsl:text>
                    <xsl:value-of select="local-name()"/>
                    <xsl:text>&gt;</xsl:text>
            </xsl:if>
        </fo:block>

        <xsl:if test="*">
            <fo:block>
                <xsl:apply-templates mode="print_as_xml">
                    <xsl:with-param name="level" select="$level + 1"/>
                </xsl:apply-templates>
            </fo:block>
            <fo:block margin-left="{2*$level}mm">
                <xsl:text>&lt;/</xsl:text>
                <xsl:value-of select="local-name()"/>
                <xsl:text>&gt;</xsl:text>
            </fo:block>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>