Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1ZrPBe-0008D6-Sm for pgsql-docs@arkaria.postgresql.org; Wed, 28 Oct 2015 11:46:39 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84) (envelope-from ) id 1ZrPBe-0001en-9L for pgsql-docs@arkaria.postgresql.org; Wed, 28 Oct 2015 11:46:38 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84) (envelope-from ) id 1ZrPBd-0001eD-AA for pgsql-docs@postgresql.org; Wed, 28 Oct 2015 11:46:37 +0000 Received: from mail-wi0-x22f.google.com ([2a00:1450:400c:c05::22f]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84) (envelope-from ) id 1ZrPBW-0001tz-CA for pgsql-docs@postgresql.org; Wed, 28 Oct 2015 11:46:36 +0000 Received: by wicfv8 with SMTP id fv8so9338638wic.0 for ; Wed, 28 Oct 2015 04:46:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lelarge_info.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=6+ZZcMaH5rm+4ORcTqn+Wdz4m0ABl5T39lBsEtRAwDg=; b=k8PRp5PsbqacJtBrI9p5upxE214a9TWPmPKHh4YkObN9jg0Y/rK00QtkR7JU6iwp80 qTQhPuWjI+PkPxD63Z2iO3UvzOtfDW+Wc518PV7V1g1HB05mbcXpet/Gt45TvOXV/NTU ENscPX7erOZbKtgHJ/GZCY3s7Rq9A7DuDSGpRVX7WOPets4CCisKV5xWXOjbkyJKNZmM rF+uxtE62/KNakd3H8N1p+9BkZ0PitT/Hgkk2P5diTtA4wWpYYv9MjmAT4Fz6gsYFbaR lFve/6kp2w2VQVsBAhY93viwl+xs/6KU4A/HabfttL2E8nzd0mi6k6L/8ESc4871FuiT D5vA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=6+ZZcMaH5rm+4ORcTqn+Wdz4m0ABl5T39lBsEtRAwDg=; b=HfaXdM3alpPe9Nx2rXraUg8MOi31sz5uprCb6J1W5aaiuMEi25MT8ePuLQ/GKJt7kf d2HVyndsMEf1ilhIAfOiqeDm60gSZ41ksSUKbZ/1/dFqNbQficr67dXuYOOdC5ZJj0sB khqez7thRIi1EhiY0TF1xXg3hKg78Wiaj8aef8MfZmGH1arW2CRFDWWs6mgwjbknE7Pd HB0isSjIomvXcKTLTW8qefSMg8esOZ4gb2BJw3t4EFgvKQbzCPreJIT6VybQkuehH5TF SxgMuDaYXsfACtLI7l/jOkpyqdpGCVp9P7hqPstoPbPOziFAG5N1sh+I400PInMBUIBK K6iQ== X-Gm-Message-State: ALoCoQlhpZnzOtSxyAWGLYjoITmRNavxXxSAzErh6Paz/qAl6NCy7LeoRcxMLHakWSg8WMiliQ85 MIME-Version: 1.0 X-Received: by 10.180.182.8 with SMTP id ea8mr2400226wic.35.1446032788779; Wed, 28 Oct 2015 04:46:28 -0700 (PDT) Received: by 10.194.186.239 with HTTP; Wed, 28 Oct 2015 04:46:28 -0700 (PDT) Received: by 10.194.186.239 with HTTP; Wed, 28 Oct 2015 04:46:28 -0700 (PDT) In-Reply-To: <562E061B.1090809@postgrespro.ru> References: <1428009501118.85114@postgrespro.ru> <5522E656.4060201@gmx.net> <562E061B.1090809@postgrespro.ru> Date: Wed, 28 Oct 2015 12:46:28 +0100 Message-ID: Subject: Re: Moving documentation to XML From: Guillaume Lelarge To: Alexander Lakhin Cc: "pgsql-docs@postgresql org" , Luzanov Pavel , Peter Eisentraut Content-Type: multipart/alternative; boundary=047d7b66f93bb59003052328beaa X-Pg-Spam-Score: -2.6 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-docs Precedence: bulk Sender: pgsql-docs-owner@postgresql.org --047d7b66f93bb59003052328beaa Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Le 26 oct. 2015 6:40 PM, "Alexander Lakhin" a =C3=A9crit : > > Hello, Peter. > > I've managed to speed up html generation from xml (make xslthtml) from 32 min. (in my environment) to 4 min. by modifying slowest XSL templates. > All my modifications incorporated in a single file stylesheet-xhtml-speedup.xsl, which is included in stylesheet.xsl. > I performed optimization by analyzing output of: > xsltproc --profile --stringparam pg.version '9.6devel' stylesheet.xsl postgres.xml > Initial statistics: > number match name mode Calls Tot 100us Avg > > 0 appendix label.markup > 23090 90677526 3927 > 1 chapter label.markup > 28870 39740757 1376 > 2 chunk-all-sections 1289 23845066 18498 > 3 make.legalnotice.head.links > 2578 9630258 3735 > 4 indexterm reference 2579 4126513 1600 > 5 html.head 1289 3112534 2414 > ... > index % time self children called name > 0.479 1326.034 22/23090 toc.line [61] > 5.128 1308.245 21944/23090 sect1[label.markup] [13] > 3.772 1318.264 850/23090 substitute-markup [15] > 1.355 1304.631 274/23090 figure|table|example[label.markup] [32] > [0] 47.95 906.775 1.613 23090 appendix[label.markup] [0] > 1.613 0.000 23090/23090 autolabel.format [29] > ----------------------------------------------- > 5.128 1308.245 24708/28870 sect1[label.markup] [13] > 0.479 1326.034 130/28870 toc.line [61] > 3.772 1318.264 2112/28870 substitute-markup [15] > 1.355 1304.631 1920/28870 figure|table|example[label.markup] [32] > [1] 21.01 397.408 1.613 28870 chapter[label.markup] [1] > 1.613 0.000 28870/28870 autolabel.format [29] > ----------------------------------------------- > 0.164 238.606 1289/1289 process-chunk-element [98] > [2] 12.61 238.451 0.225 1289 chunk-all-sections [2] > 0.225 7.117 1289/1289 process-chunk [86] > ----------------------------------------------- > 31.125 112.261 1289/2578 html.head [5] > 96.303 96.726 1289/2578 make.legalnotice.head.links [3= ] > [3] 5.09 96.303 96.726 2578 make.legalnotice.head.links [3] > 96.303 96.726 1289/3867 make.legalnotice.head.links [3= ] > 0.339 0.494 1289/3867 *[object.title.markup.textonly] [69] > 0.085 0.781 1289/3867 ln.or.rh.filename [116] > > ----------------------------------------------- > > > Currrent statistics: > number match name mode Calls Tot 100us Avg > > 0 chunk-all-sections 1289 5405958 4193 > 1 make.legalnotice.head.links > 1289 3159538 2451 > 2 html.head 1289 3068417 2380 > 3 gentext.template 689835 2327761 3 > 4 l10n.language 564453 1455253 2 > 5 href.target 29881 1344063 44 > --- > index % time self children called name > 0.136 54.207 1289/1289 process-chunk-element [95] > [0] 20.40 54.060 0.312 1289 chunk-all-sections [0] > 0.312 6.468 1289/1289 process-chunk [67] > ----------------------------------------------- > 30.684 45.458 1289/1289 html.head [2] > [1] 11.92 31.595 0.448 1289 make.legalnotice.head.links [1] > 0.290 0.403 1289/2578 *[object.title.markup.textonly] [71] > 0.159 0.828 1289/2578 ln.or.rh.filename [91] > ----------------------------------------------- > 0.330 31.617 1289/1289 chunk-element-content [65] > [2] 11.58 30.684 45.458 1289 html.head [2] > 31.595 0.448 1289/15462 make.legalnotice.head.links [1] > 13.441 4.726 5153/15462 href.target [5] > 0.290 0.403 5153/15462 *[object.title.markup.textonly] [71] > 0.115 1.576 1289/15462 head.content [99] > 0.012 0.000 1289/15462 system.head.content [186] > 0.006 0.000 1289/15462 user.head.content [228] > > To make sure that result of the transformation is the same, I've compared original .html's with .html's generated with modified templates. > Unfortunately xslt generates random id's, so it's needed to exclude them before comparing. I do that with: > for f in */*.html; do sed -e 's/id=3D\"\(ftn\.\)\?id[a-z][0-9]\+\"/id=3D\"id\"/g' -i $f ; sed -e 's/href=3D\"[^#]*#\(ftn\.\)\?id[a-z][0-9]\+\"/href=3D\"#\"/g' -i $f; done > > > So if it's acceptable way to speed up generation of HTML (and maybe some other formats), what other steps should we take to move away from SGML? > If the performance is still not satisfying, please let me know, I'll continue to optimize xslt. > Beside performance issues, I can see some difference in results of 'make html' and 'make xslthtml'. For example, see doc/src/sgml/html/spi.html (xslt-generated version doesn't contain the lists of functions). > What you've done is awesome. I can't wait to test it on the french translation. Nice work! --047d7b66f93bb59003052328beaa Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

Le=C2=A026 oct. 2015 6:40 PM, "Alexander Lakhin" &= lt;a.lakhin@postgrespro.ru&g= t; a =C3=A9crit=C2=A0:
>
> Hello, Peter.
>
> I've managed to speed up html generation from xml (make xslthtml) = from 32 min. (in my environment) to 4 min. by modifying slowest XSL templat= es.
> All my modifications incorporated in a single file stylesheet-xhtml-sp= eedup.xsl, which is included in stylesheet.xsl.
> I performed optimization by analyzing output of:
> xsltproc --profile --stringparam pg.version '9.6devel' stylesh= eet.xsl postgres.xml
> Initial statistics:
> number=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0match=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 name=C2=A0 =C2=A0 =C2= =A0 mode Calls Tot 100us Avg
>
> =C2=A0 =C2=A0 0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0appendi= x label.markup
> 23090 90677526=C2=A0 =C2=A03927
> =C2=A0 =C2=A0 1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 chapte= r label.markup
> 28870 39740757=C2=A0 =C2=A01376
> =C2=A0 =C2=A0 2 chunk-all-sections=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A01289 23845066=C2=A0 18498
> =C2=A0 =C2=A0 3=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0make.legalnotice.head.links
> 2578 9630258=C2=A0 =C2=A03735
> =C2=A0 =C2=A0 4=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 indexterm ref= erence=C2=A0 =C2=A02579 4126513=C2=A0 =C2=A01600
> =C2=A0 =C2=A0 5 html.head=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A01289 3112534=C2=A0 =C2=A02414
> ...
> index % time=C2=A0 =C2=A0 self=C2=A0 children=C2=A0 =C2=A0 called=C2= =A0 =C2=A0 =C2=A0name
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.479 1326.034= =C2=A0 =C2=A0 =C2=A022/23090=C2=A0 =C2=A0 =C2=A0toc.line [61]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 5.128 1308.245= =C2=A0 21944/23090 sect1[label.markup] [13]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 3.772 1318.264= =C2=A0 =C2=A0 850/23090 substitute-markup [15]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1.355 1304.631= =C2=A0 =C2=A0 274/23090 figure|table|example[label.markup] [32]
> [0]=C2=A0 =C2=A0 47.95=C2=A0 906.775=C2=A0 =C2=A0 1.613=C2=A0 23090 ap= pendix[label.markup] [0]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1.613=C2=A0 = =C2=A0 0.000=C2=A0 23090/23090 autolabel.format [29]
> -----------------------------------------------
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 5.128 1308.245= =C2=A0 24708/28870 sect1[label.markup] [13]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.479 1326.034= =C2=A0 =C2=A0 130/28870=C2=A0 =C2=A0 =C2=A0toc.line [61]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 3.772 1318.264= =C2=A0 =C2=A02112/28870 substitute-markup [15]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1.355 1304.631= =C2=A0 =C2=A01920/28870 figure|table|example[label.markup] [32]
> [1]=C2=A0 =C2=A0 21.01=C2=A0 397.408=C2=A0 =C2=A0 1.613=C2=A0 28870 ch= apter[label.markup] [1]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1.613=C2=A0 = =C2=A0 0.000=C2=A0 28870/28870 autolabel.format [29]
> -----------------------------------------------
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.164=C2=A0 23= 8.606=C2=A0 =C2=A01289/1289 process-chunk-element [98]
> [2]=C2=A0 =C2=A0 12.61=C2=A0 238.451=C2=A0 =C2=A0 0.225=C2=A0 =C2=A012= 89 chunk-all-sections [2]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.225=C2=A0 = =C2=A0 7.117=C2=A0 =C2=A01289/1289 process-chunk [86]
> -----------------------------------------------
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A031.125=C2=A0 11= 2.261=C2=A0 =C2=A01289/2578=C2=A0 =C2=A0 =C2=A0 html.head [5]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A096.303=C2=A0 = =C2=A096.726=C2=A0 =C2=A01289/2578 make.legalnotice.head.links [3]
> [3]=C2=A0 =C2=A0 =C2=A05.09=C2=A0 =C2=A096.303=C2=A0 =C2=A096.726=C2= =A0 =C2=A02578 make.legalnotice.head.links [3]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A096.303=C2=A0 = =C2=A096.726=C2=A0 =C2=A01289/3867 make.legalnotice.head.links [3]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.339=C2=A0 = =C2=A0 0.494=C2=A0 =C2=A01289/3867 *[object.title.markup.textonly] [69]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.085=C2=A0 = =C2=A0 0.781=C2=A0 =C2=A01289/3867 ln.or.rh.filename [116]
>
> -----------------------------------------------
>
>
> Currrent statistics:
> number=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0match=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 name=C2=A0 =C2=A0 =C2= =A0 mode Calls Tot 100us Avg
>
> =C2=A0 =C2=A0 0 chunk-all-sections=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A01289 5405958=C2=A0 =C2=A04193
> =C2=A0 =C2=A0 1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0make.legalnotice.head.links
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01289 3159= 538=C2=A0 =C2=A02451
> =C2=A0 =C2=A0 2 html.head=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A01289 3068417=C2=A0 =C2=A02380
> =C2=A0 =C2=A0 3=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0gentext.template 689835 2327761=C2=A0 = =C2=A0 =C2=A0 3
> =C2=A0 =C2=A0 4=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 l10n.language 564453 1455253=C2= =A0 =C2=A0 =C2=A0 2
> =C2=A0 =C2=A0 5 href.target=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 2= 9881 1344063=C2=A0 =C2=A0 =C2=A044
> ---
> index % time=C2=A0 =C2=A0 self=C2=A0 children=C2=A0 =C2=A0 called=C2= =A0 =C2=A0 =C2=A0name
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.136=C2=A0 = =C2=A054.207=C2=A0 =C2=A01289/1289 process-chunk-element [95]
> [0]=C2=A0 =C2=A0 20.40=C2=A0 =C2=A054.060=C2=A0 =C2=A0 0.312=C2=A0 =C2= =A01289 chunk-all-sections [0]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.312=C2=A0 = =C2=A0 6.468=C2=A0 =C2=A01289/1289 process-chunk [67]
> -----------------------------------------------
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A030.684=C2=A0 = =C2=A045.458=C2=A0 =C2=A01289/1289=C2=A0 =C2=A0 =C2=A0 html.head [2]
> [1]=C2=A0 =C2=A0 11.92=C2=A0 =C2=A031.595=C2=A0 =C2=A0 0.448=C2=A0 =C2= =A01289 make.legalnotice.head.links [1]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.290=C2=A0 = =C2=A0 0.403=C2=A0 =C2=A01289/2578 *[object.title.markup.textonly] [71]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.159=C2=A0 = =C2=A0 0.828=C2=A0 =C2=A01289/2578 ln.or.rh.filename [91]
> -----------------------------------------------
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.330=C2=A0 = =C2=A031.617=C2=A0 =C2=A01289/1289 chunk-element-content [65]
> [2]=C2=A0 =C2=A0 11.58=C2=A0 =C2=A030.684=C2=A0 =C2=A045.458=C2=A0 =C2= =A01289=C2=A0 =C2=A0 =C2=A0html.head [2]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A031.595=C2=A0 = =C2=A0 0.448=C2=A0 =C2=A01289/15462 make.legalnotice.head.links [1]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A013.441=C2=A0 = =C2=A0 4.726=C2=A0 =C2=A05153/15462 href.target [5]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.290=C2=A0 = =C2=A0 0.403=C2=A0 =C2=A05153/15462 *[object.title.markup.textonly] [71] > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.115=C2=A0 = =C2=A0 1.576=C2=A0 =C2=A01289/15462 head.content [99]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.012=C2=A0 = =C2=A0 0.000=C2=A0 =C2=A01289/15462 system.head.content [186]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0.006=C2=A0 = =C2=A0 0.000=C2=A0 =C2=A01289/15462 user.head.content [228]
>
> To make sure that result of the transformation is the same, I've c= ompared original .html's with .html's generated with modified templ= ates.
> Unfortunately xslt generates random id's, so it's needed to ex= clude them before comparing. I do that with:
> for f in */*.html; do sed -e 's/id=3D\"\(ftn\.\)\?id[a-z][0-9= ]\+\"/id=3D\"id\"/g' -i $f ; sed -e 's/href=3D\"= ;[^#]*#\(ftn\.\)\?id[a-z][0-9]\+\"/href=3D\"#\"/g' -i $f= ; done
>
>
> So if it's acceptable way to speed up generation of HTML (and mayb= e some other formats), what other steps should we take to move away from SG= ML?
> If the performance is still not satisfying, please let me know, I'= ll continue to optimize xslt.
> Beside performance issues, I can see some difference in results of = 9;make html' and 'make xslthtml'. For example, see doc/src/sgml= /html/spi.html (xslt-generated version doesn't contain the lists of fun= ctions).
>

What you've done is awesome. I can't wait to test it= on the french translation.

Nice work!

--047d7b66f93bb59003052328beaa--