blob: 07e7d1fadaea329ac7aa605ca7b264d0f2f7659f [file] [log] [blame]
Akron9a8ee3e2022-01-31 13:51:49 +01001<?xml version="1.0" encoding="UTF-8"?>
2<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
bansp5e2d1c02022-03-10 04:51:40 +01003 xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:nkjp="http://www.nkjp.pl/ns/1.0"
4 xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:f="func"
Piotr Banskif8af3a92022-05-23 03:20:10 +02005 xmlns:fn="http://www.w3.org/2005/xpath-functions"
Piotr Banski6a4a2522022-05-24 01:16:47 +02006 xmlns:map="http://www.w3.org/2005/xpath-functions/map" exclude-result-prefixes="xs f fn map nkjp tei"
bansp5e2d1c02022-03-10 04:51:40 +01007 version="3.0" expand-text="yes">
Akron9a8ee3e2022-01-31 13:51:49 +01008
banspe726b4a2022-03-28 05:47:45 +02009
10<!-- PARAMETERS -->
bansp5e2d1c02022-03-10 04:51:40 +010011
bansp8f6700b2022-03-27 05:27:09 +020012 <xsl:param name="sourceDir" select="'test/resources/nkjp2korap_sample2'" as="xs:string"/>
banspd1bf1db2022-04-04 02:16:24 +020013 <!-- the directory containing NKJP files, in the form of a collection of text-level dirs
14 (that is how we know both the $corpusID and the $docID) -->
Akron9a8ee3e2022-01-31 13:51:49 +010015
bansp8f6700b2022-03-27 05:27:09 +020016 <xsl:param name="targetDir" select="'test/output'" as="xs:string"/>
banspd1bf1db2022-04-04 02:16:24 +020017 <!-- where the corpus/document/text/annotations hierarchy is going to be created -->
banspf2b24e62022-03-28 18:12:08 +020018
19 <xsl:param name="skip_docID" as="xs:string">
Piotr Banski1ae16bd2022-05-25 15:59:40 +020020 <xsl:value-of select="''"/>
21 <!--<xsl:value-of select="'HellerPodgladanie,IsakowiczZaleskiMoje,KolakowskiOco,MysliwskiKamien,WilkWilczy,ZycieWarszawy_Zycie'"/>-->
banspb5992532022-03-29 15:55:44 +020022 </xsl:param>
23 <!-- comma-separated list of document IDs to be skipped from processing
banspf2b24e62022-03-28 18:12:08 +020024 example: HellerPodgladanie,KOT
banspd1bf1db2022-04-04 02:16:24 +020025 no functionality beyond string identity is supported
26 (this is just for testing) -->
banspb5992532022-03-29 15:55:44 +020027
Piotr Banski1ae16bd2022-05-25 15:59:40 +020028 <xsl:param name="SHOW_ORTH_IN_STRUCT" as="xs:boolean" select="true()"/>
Piotr Banski09096ee2022-05-25 13:41:03 +020029 <!-- for debugging structure.xml production -->
30
bansp8f6700b2022-03-27 05:27:09 +020031
bansp9dc10002022-05-17 22:33:34 +020032<!-- VARIABLES (= constants...) -->
banspe726b4a2022-03-28 05:47:45 +020033
34 <xsl:variable name="corpusID" as="xs:string" select="'NKJP'" static="yes"/>
35 <xsl:variable name="docID" as="xs:string" select="'NKJP'" static="yes"/>
bansp8f6700b2022-03-27 05:27:09 +020036
37 <xsl:variable name="targetCorpusDir_slashed" select="$targetDir || '/' || $corpusID || '/'" as="xs:string"/>
bansp5e2d1c02022-03-10 04:51:40 +010038
banspd1bf1db2022-04-04 02:16:24 +020039 <xsl:variable name="systemDoctypeI5" as="xs:string"
40 select="'http://corpora.ids-mannheim.de/I5/DTD/i5.dtd'" static="true"/>
bansp5e2d1c02022-03-10 04:51:40 +010041
banspd1bf1db2022-04-04 02:16:24 +020042 <xsl:variable name="publicDoctypeI5" as="xs:string" static="true"
43 select="'-//IDS//DTD I5 1.0//EN'"/>
bansp5e2d1c02022-03-10 04:51:40 +010044
banspd1bf1db2022-04-04 02:16:24 +020045 <xsl:variable name="KorAP_namespace" static="true" as="xs:string"
46 select="'http://ids-mannheim.de/ns/KorAP'"/>
bansp5e2d1c02022-03-10 04:51:40 +010047
bansp5f841732022-03-16 06:27:31 +010048 <xsl:variable name="KorAP-XML_version" select="'KorAP-0.4'" as="xs:string" static="true"/>
49 <!-- this is only a bit funny -->
50
banspe726b4a2022-03-28 05:47:45 +020051 <xsl:variable name="collection_params" as="xs:string" static="yes"
52 select="'recurse=yes;validation=strip;select=text.xml;content-type=application/xml;on-error=warning;xinclude=yes'"
53 />
54 <!-- see https://www.saxonica.com/documentation11/index.html#!sourcedocs/collections/collection-directories -->
55
56 <xsl:variable name="collection_of_text" select="collection($sourceDir || '?' || $collection_params)" as="document-node()+"/>
banspd1bf1db2022-04-04 02:16:24 +020057
banspe726b4a2022-03-28 05:47:45 +020058<!-- MODES -->
bansp5e2d1c02022-03-10 04:51:40 +010059
60 <xsl:mode name="corpus" on-no-match="deep-skip"/>
61 <xsl:mode name="text" on-no-match="deep-skip"/>
bansp9103aab2022-03-19 05:10:21 +010062 <xsl:mode name="header-text" on-no-match="text-only-copy"/>
Piotr Banski6a4a2522022-05-24 01:16:47 +020063 <xsl:mode use-accumulators="#all"/>
Piotr Banski09096ee2022-05-25 13:41:03 +020064
65 <xsl:accumulator name="element-index" as="xs:integer" initial-value="0">
66 <xsl:accumulator-rule match="tei:*[ancestor-or-self::tei:text]" select="$value + 1" phase="start"/>
67 </xsl:accumulator>
Piotr Banskifdc858a2022-05-25 02:40:32 +020068
69 <xsl:accumulator name="elem-offset-seq" as="map(xs:string, item()+)+" initial-value="(map{'null':(0,0)})">
70
71 <xsl:accumulator-rule match="tei:body/tei:p" phase="start">
72 <xsl:variable name="preceding_index" as="xs:integer">
73 <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
74 <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
Piotr Banski6a4a2522022-05-24 01:16:47 +020075 </xsl:variable>
76
Piotr Banskifdc858a2022-05-25 02:40:32 +020077 <xsl:variable name="our_base" as="xs:integer" select="if($preceding_index eq 0) then $preceding_index else $preceding_index + 1"/>
78 <!-- for paragraphs, it's in either being initial or not -->
Piotr Banski09096ee2022-05-25 13:41:03 +020079
Piotr Banskifdc858a2022-05-25 02:40:32 +020080 <xsl:sequence select="
81 $value,
82 map {
83 string(@xml:id): ($preceding_index,$our_base)
84 }"/>
85 </xsl:accumulator-rule>
86
87 <xsl:accumulator-rule match="tei:s" phase="start">
88 <xsl:variable name="preceding_index" as="xs:integer">
89 <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
90 <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
Piotr Banskifdc858a2022-05-25 02:40:32 +020091 </xsl:variable>
Piotr Banskifdc858a2022-05-25 02:40:32 +020092 <xsl:variable name="our_base" as="xs:integer" select="if($preceding_index eq 0) then $preceding_index else $preceding_index + + xs:integer(f:is_preceded_by_ws(.,true()))"/>
Piotr Banski09096ee2022-05-25 13:41:03 +020093
Piotr Banskifdc858a2022-05-25 02:40:32 +020094 <xsl:sequence select="
95 $value,
96 map {
97 string(@xml:id): ($preceding_index,$our_base)
98 }"/>
99 </xsl:accumulator-rule>
100
101 <xsl:accumulator-rule match="tei:w[parent::tei:seg[count(@nkjp:rejected) eq 0]]" phase="end">
102 <xsl:variable name="preceding_index" as="xs:integer">
103 <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
104 <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
Piotr Banskifdc858a2022-05-25 02:40:32 +0200105 </xsl:variable>
106 <xsl:variable name="our_base" as="xs:integer" select="$preceding_index + xs:integer(f:is_preceded_by_ws(parent::tei:seg,true()))"/>
Piotr Banski09096ee2022-05-25 13:41:03 +0200107
Piotr Banski6a4a2522022-05-24 01:16:47 +0200108 <xsl:sequence select="
109 $value,
110 map {
Piotr Banski69f3c5f2022-05-24 10:52:09 +0200111 string(parent::tei:seg/@xml:id): ($our_base,$our_base + string-length())
Piotr Banski6a4a2522022-05-24 01:16:47 +0200112 }"/>
113 </xsl:accumulator-rule>
Piotr Banskifdc858a2022-05-25 02:40:32 +0200114
115 <xsl:accumulator-rule match="tei:s" phase="end">
116 <xsl:variable name="preceding_index" as="xs:integer">
117 <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
118 <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
Piotr Banski09096ee2022-05-25 13:41:03 +0200119
Piotr Banskifdc858a2022-05-25 02:40:32 +0200120 </xsl:variable>
121 <xsl:variable name="our_base" as="xs:integer">
122 <xsl:variable name="incomplete" select="map:find($value,string(@xml:id))(1)" as="xs:integer+"/>
123 <xsl:sequence select="$incomplete[2]"/>
124 </xsl:variable>
Piotr Banski09096ee2022-05-25 13:41:03 +0200125
Piotr Banskifdc858a2022-05-25 02:40:32 +0200126 <xsl:sequence select="
127 $value,
128 map {
129 string(@xml:id): ($our_base,$preceding_index)
130 }"/>
131 </xsl:accumulator-rule>
132
133 <xsl:accumulator-rule match="tei:body/tei:p" phase="end">
134 <xsl:variable name="preceding_index" as="xs:integer">
135 <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
136 <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
137
Piotr Banskifdc858a2022-05-25 02:40:32 +0200138 </xsl:variable>
139 <xsl:variable name="our_base" as="xs:integer">
140 <xsl:variable name="incomplete" select="map:find($value,string(@xml:id))(1)" as="xs:integer+"/>
141 <xsl:sequence select="$incomplete[2]"/>
142 </xsl:variable>
Piotr Banski09096ee2022-05-25 13:41:03 +0200143
Piotr Banskifdc858a2022-05-25 02:40:32 +0200144 <xsl:sequence select="
145 $value,
146 map {
147 string(@xml:id): ($our_base,$preceding_index)
148 }"/>
149 </xsl:accumulator-rule>
150
151 <xsl:accumulator-rule match="tei:body" phase="end">
152 <xsl:variable name="preceding_index" as="xs:integer">
153 <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
154 <xsl:sequence select="map:get($the_tail, map:keys($the_tail)[1])[2]"/>
155 </xsl:variable>
156
157 <xsl:sequence select="
158 $value,
159 map {
160 string(@xml:id): (0, $preceding_index)
161 }"/>
162 </xsl:accumulator-rule>
163
164 <xsl:accumulator-rule match="tei:text" phase="end">
165 <xsl:variable name="preceding_index" as="xs:integer">
166 <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
167 <xsl:sequence select="map:get($the_tail, map:keys($the_tail)[1])[2]"/>
168 </xsl:variable>
169
170 <xsl:sequence select="
171 $value,
172 map {
173 string(@xml:id): (0, $preceding_index)
174 }"/>
175 </xsl:accumulator-rule>
Piotr Banski6a4a2522022-05-24 01:16:47 +0200176 </xsl:accumulator>
bansp5e2d1c02022-03-10 04:51:40 +0100177
banspe726b4a2022-03-28 05:47:45 +0200178 <!-- FUNCTIONS -->
179
bansp5f841732022-03-16 06:27:31 +0100180 <xsl:function name="f:compute_nesting" as="xs:integer">
banspd1bf1db2022-04-04 02:16:24 +0200181 <xsl:param name="node" as="element()"/>
bansp5f841732022-03-16 06:27:31 +0100182 <xsl:variable name="rel_depth"
183 select="count($node/ancestor-or-self::*[local-name(.) ne 'TEI'][local-name(.) ne 'teiCorpus'])"
184 as="xs:integer"/>
bansp5f841732022-03-16 06:27:31 +0100185 <xsl:sequence select="$rel_depth"/>
186 </xsl:function>
187
bansp9dc10002022-05-17 22:33:34 +0200188<xsl:function name="f:is_preceded_by_ws" as="xs:boolean">
189 <xsl:param name="node" as="element()"/>
Piotr Banskifdc858a2022-05-25 02:40:32 +0200190 <xsl:param name="suppress_initial" as="xs:boolean"/>
bansp9dc10002022-05-17 22:33:34 +0200191 <xsl:choose>
Piotr Banskifdc858a2022-05-25 02:40:32 +0200192 <xsl:when test="local-name($node) eq 'seg'">
193 <xsl:choose>
194 <xsl:when test="$node/@nkjp:nps"><xsl:sequence select="fn:false()"/></xsl:when>
Piotr Banski09096ee2022-05-25 13:41:03 +0200195 <xsl:when test="$node/preceding::tei:seg[count(@nkjp:rejected) eq 0][ancestor::tei:s[descendant::tei:seg = $node]]"><xsl:sequence select="fn:true()"/></xsl:when>
196 <!-- this is checking if we're preceding by a seg under the same tei:s, modulo choice/paren -->
197 <!-- THIS CHECK should be streamlined for efficiency, maybe try comparing positions in the descendant axis -->
Piotr Banskifdc858a2022-05-25 02:40:32 +0200198 <xsl:otherwise>
199 <xsl:sequence
200 select="not($suppress_initial) and not($node[count(preceding-sibling::tei:seg) eq 0]/ancestor::tei:s[count(preceding-sibling::tei:s) eq 0]/ancestor::tei:p[count(preceding-sibling::tei:p) eq 0])"
201 />
202 </xsl:otherwise>
203 </xsl:choose>
Piotr Banski4f4c2d22022-05-19 01:44:32 +0200204
bansp9dc10002022-05-17 22:33:34 +0200205 </xsl:when>
206 <xsl:when test="local-name($node) eq 's'">
Piotr Banskifdc858a2022-05-25 02:40:32 +0200207 <xsl:choose>
208 <xsl:when test="exists($node/preceding-sibling::tei:s)"><xsl:sequence select="fn:true()"/></xsl:when>
209 <xsl:otherwise>
Piotr Banskifdc858a2022-05-25 02:40:32 +0200210 <xsl:sequence select="not($suppress_initial) and exists($node/ancestor::tei:p[1]/preceding-sibling::tei:p)"/>
211 </xsl:otherwise>
212 </xsl:choose>
bansp9dc10002022-05-17 22:33:34 +0200213
bansp9dc10002022-05-17 22:33:34 +0200214 </xsl:when>
215 <xsl:when test="local-name($node) eq 'p'">
bansp9dc10002022-05-17 22:33:34 +0200216 <xsl:sequence select="exists($node/preceding-sibling::tei:p)"/>
217 </xsl:when>
218 <xsl:otherwise>
219 <xsl:message terminate="yes" select="'Wrong argument passed to f:is_preceded_by_ws(): ' || local-name($node) || ' Only p, s, seg are allowed.'"></xsl:message>
220 </xsl:otherwise>
221 </xsl:choose>
222</xsl:function>
banspd1bf1db2022-04-04 02:16:24 +0200223
banspb5992532022-03-29 15:55:44 +0200224<!-- UTILITY TEMPLATES -->
225
bansp9103aab2022-03-19 05:10:21 +0100226 <xsl:template match="@default" mode="#all"/>
bansp97ba7ce2022-03-26 05:14:06 +0100227 <!-- this is to delete some auto-inserted attribute throughout -->
bansp9103aab2022-03-19 05:10:21 +0100228
Piotr Banski6a4a2522022-05-24 01:16:47 +0200229 <xsl:template match="tei:w" mode="#all"/>
banspe726b4a2022-03-28 05:47:45 +0200230<!-- NKJP-SGJP has apparently resigned from standoff representations by adding <w> everywhere;
Piotr Banskifdc858a2022-05-25 02:40:32 +0200231 we reach for them, but from the level of <seg>, so we don't need to process <w> separately -->
bansp8f6700b2022-03-27 05:27:09 +0200232
Piotr Banski09096ee2022-05-25 13:41:03 +0200233 <!-- fall-thru, skipping the potential <paren> element and filtering out the bad guys -->
Piotr Banski6a4a2522022-05-24 01:16:47 +0200234 <xsl:template match="tei:choice" mode="struct">
Piotr Banski09096ee2022-05-25 13:41:03 +0200235 <xsl:apply-templates select="descendant::tei:seg[count(@nkjp:rejected) eq 0]" mode="struct"/>
Piotr Banski6a4a2522022-05-24 01:16:47 +0200236 </xsl:template>
Piotr Banskia51907c2022-05-25 15:09:41 +0200237 <xsl:template match="tei:choice" mode="morpho">
238 <xsl:apply-templates select="descendant::tei:seg[count(@nkjp:rejected) eq 0]" mode="morpho"/>
239 </xsl:template>
banspb5992532022-03-29 15:55:44 +0200240
241 <!-- MAIN PROCESSING -->
242
bansp5e2d1c02022-03-10 04:51:40 +0100243 <xsl:template name="xsl:initial-template">
banspf2b24e62022-03-28 18:12:08 +0200244 <xsl:variable name="IDs_to_skip" select="tokenize($skip_docID,',')" as="xs:string*"/>
banspd1bf1db2022-04-04 02:16:24 +0200245
banspe726b4a2022-03-28 05:47:45 +0200246 <!-- we only want to call the template below once, and we process a random NKJP corpus file for that purpose,
bansp8f6700b2022-03-27 05:27:09 +0200247 because all we need is the main corpus header, and we can (should) get to that from any NKJP corpus document -->
248 <xsl:call-template name="create_corpus_header">
banspe726b4a2022-03-28 05:47:45 +0200249 <xsl:with-param name="text.xml" select="$collection_of_text[1]" as="document-node()"/>
bansp8f6700b2022-03-27 05:27:09 +0200250 <xsl:with-param name="target" select="$targetCorpusDir_slashed || 'header.xml'" as="xs:string"/>
251 </xsl:call-template>
252
banspe726b4a2022-03-28 05:47:45 +0200253 <xsl:for-each select="$collection_of_text">
254 <xsl:variable name="my_dir" as="xs:string" select="replace(base-uri(),'/text\.xml','')"/>
255 <xsl:variable name="my_textID" as="xs:string" select="tokenize($my_dir,'/')[last()]"/>
256 <xsl:variable name="ann_morphosyntax.uri" select="$my_dir || '/ann_morphosyntax.xml'" as="xs:string"/>
257 <xsl:variable name="ann_segmentation.uri" select="$my_dir || '/ann_segmentation.xml'" as="xs:string"/>
258
banspf2b24e62022-03-28 18:12:08 +0200259 <xsl:choose>
260 <xsl:when test="$my_textID = $IDs_to_skip"/>
bansp9dc10002022-05-17 22:33:34 +0200261 <!-- this is a utility step, for when we want to ignore some texts for any reason (debugging, selective update) -->
banspf2b24e62022-03-28 18:12:08 +0200262 <xsl:otherwise>
banspd1bf1db2022-04-04 02:16:24 +0200263
bansp9dc10002022-05-17 22:33:34 +0200264 <xsl:call-template name="process_single_sample">
banspf2b24e62022-03-28 18:12:08 +0200265 <xsl:with-param name="text.xml" as="document-node()" select="."/>
266 <xsl:with-param name="ann_morphosyntax.xml" as="document-node()"
267 select="doc($ann_morphosyntax.uri)"/>
268 <xsl:with-param name="ann_segmentation.xml" as="document-node()"
269 select="doc($ann_segmentation.uri)"/>
270 <xsl:with-param name="my_textID" select="$my_textID" as="xs:string"/>
bansp9dc10002022-05-17 22:33:34 +0200271 </xsl:call-template>
banspf2b24e62022-03-28 18:12:08 +0200272 </xsl:otherwise>
273 </xsl:choose>
banspe726b4a2022-03-28 05:47:45 +0200274 </xsl:for-each>
bansp8f6700b2022-03-27 05:27:09 +0200275 </xsl:template>
276
277 <xsl:template name="process_single_sample">
banspe726b4a2022-03-28 05:47:45 +0200278 <xsl:param name="text.xml" as="document-node()"/>
279 <xsl:param name="ann_morphosyntax.xml" as="document-node()"/>
280 <xsl:param name="ann_segmentation.xml" as="document-node()"/>
banspd1bf1db2022-04-04 02:16:24 +0200281 <xsl:param name="my_textID" as="xs:string" select="'0-BAD_textID'"/>
bansp9dc10002022-05-17 22:33:34 +0200282 <!-- empty textID should never happen, but if it does, it will be signalled at the top of the output -->
banspe726b4a2022-03-28 05:47:45 +0200283
284 <xsl:variable name="targetBaseDir" as="xs:string" select="$targetCorpusDir_slashed || $docID || '/' || $my_textID"/>
285
286 <xsl:variable name="compoundID" as="xs:string"
287 select="$corpusID || '_' || $docID || '.' || $my_textID"/>
288 <!-- this is what occurs in the text and data layers as @docid -->
289
bansp5e2d1c02022-03-10 04:51:40 +0100290 <xsl:call-template name="create_data">
bansp9dc10002022-05-17 22:33:34 +0200291 <xsl:with-param name="ann_segmentation.xml" select="$ann_segmentation.xml" as="document-node()"/>
banspe726b4a2022-03-28 05:47:45 +0200292 <xsl:with-param name="compoundID" select="$compoundID" as="xs:string"/>
293 <xsl:with-param name="target" select="$targetBaseDir || '/data.xml'" as="xs:string"/>
bansp5f841732022-03-16 06:27:31 +0100294 </xsl:call-template>
295
Piotr Banski4f4c2d22022-05-19 01:44:32 +0200296 <xsl:call-template name="create_struct">
banspe726b4a2022-03-28 05:47:45 +0200297 <xsl:with-param name="compoundID" select="$compoundID" as="xs:string"/>
bansp5f841732022-03-16 06:27:31 +0100298 <xsl:with-param name="ann_segmentation.xml" select="$ann_segmentation.xml"
299 as="document-node()"/>
banspe726b4a2022-03-28 05:47:45 +0200300 <xsl:with-param name="target" select="$targetBaseDir || '/struct/structure.xml'" as="xs:string"
bansp5f841732022-03-16 06:27:31 +0100301 />
302 </xsl:call-template>
Piotr Banski4f4c2d22022-05-19 01:44:32 +0200303
Piotr Banskia51907c2022-05-25 15:09:41 +0200304 <xsl:call-template name="create_morpho">
banspe726b4a2022-03-28 05:47:45 +0200305 <xsl:with-param name="compoundID" select="$compoundID" as="xs:string"/>
bansp3e5b20c2022-03-18 20:22:31 +0100306 <xsl:with-param name="ann_segmentation.xml" select="$ann_segmentation.xml"
307 as="document-node()"/>
bansp5f841732022-03-16 06:27:31 +0100308 <xsl:with-param name="ann_morphosyntax.xml" select="$ann_morphosyntax.xml"
309 as="document-node()"/>
banspe726b4a2022-03-28 05:47:45 +0200310 <xsl:with-param name="target" select="$targetBaseDir || '/nkjp/morpho.xml'" as="xs:string"/>
bansp5e2d1c02022-03-10 04:51:40 +0100311 </xsl:call-template>
Piotr Banskia51907c2022-05-25 15:09:41 +0200312
Piotr Banski09096ee2022-05-25 13:41:03 +0200313 <xsl:call-template name="create_text_header">
bansp5e2d1c02022-03-10 04:51:40 +0100314 <xsl:with-param name="text.xml" select="$text.xml" as="document-node()"/>
banspe726b4a2022-03-28 05:47:45 +0200315 <xsl:with-param name="compoundID" select="$compoundID" as="xs:string"/>
316 <xsl:with-param name="target" select="$targetBaseDir || '/header.xml'" as="xs:string"/>
Piotr Banski09096ee2022-05-25 13:41:03 +0200317 </xsl:call-template>
Piotr Banski6a4a2522022-05-24 01:16:47 +0200318
bansp5e2d1c02022-03-10 04:51:40 +0100319 </xsl:template>
320
321 <!-- ************************** data.xml ******************* -->
322
323 <xsl:template name="create_data">
bansp9dc10002022-05-17 22:33:34 +0200324 <xsl:param name="ann_segmentation.xml" as="document-node()"/>
banspe726b4a2022-03-28 05:47:45 +0200325 <xsl:param name="compoundID" as="xs:string"/>
bansp5f841732022-03-16 06:27:31 +0100326 <xsl:param name="target" as="xs:string"/>
bansp5e2d1c02022-03-10 04:51:40 +0100327 <!-- create the data.xml file -->
328 <xsl:result-document encoding="UTF-8" method="xml" indent="yes"
bansp5f841732022-03-16 06:27:31 +0100329 xpath-default-namespace="{$KorAP_namespace}" href="{$target}">
bansp5e2d1c02022-03-10 04:51:40 +0100330
Akron9a8ee3e2022-01-31 13:51:49 +0100331 <xsl:processing-instruction name="xml-model">href=&quot;text.rng&quot; type=&quot;application/xml&quot; schematypens=&quot;http://relaxng.org/ns/structure/1.0&quot;</xsl:processing-instruction>
bansp5e2d1c02022-03-10 04:51:40 +0100332 <xsl:element name="raw_text" namespace="{$KorAP_namespace}">
bansp5f841732022-03-16 06:27:31 +0100333 <xsl:attribute name="docid" select="$compoundID"/>
bansp5e2d1c02022-03-10 04:51:40 +0100334 <xsl:element name="metadata" namespace="{$KorAP_namespace}">
335 <xsl:attribute name="file" select="'metadata.xml'"/>
336 </xsl:element>
337
338 <xsl:element name="text" namespace="{$KorAP_namespace}">
bansp9dc10002022-05-17 22:33:34 +0200339 <xsl:variable name="content" as="xs:string+">
Piotr Banski4f4c2d22022-05-19 01:44:32 +0200340 <xsl:for-each select="$ann_segmentation.xml/tei:teiCorpus/tei:TEI/tei:text/tei:body/tei:p/tei:s//tei:seg[count(@nkjp:rejected) eq 0]">
bansp9dc10002022-05-17 22:33:34 +0200341 <xsl:sequence select="
Piotr Banskifdc858a2022-05-25 02:40:32 +0200342 if (f:is_preceded_by_ws(.,false())) then
bansp9dc10002022-05-17 22:33:34 +0200343 ' '
344 else
345 '', ./tei:w"/>
346 </xsl:for-each>
347 </xsl:variable>
348 <xsl:value-of select="string-join($content)"/>
bansp5e2d1c02022-03-10 04:51:40 +0100349 </xsl:element>
Akron9a8ee3e2022-01-31 13:51:49 +0100350 </xsl:element>
banspf79443e2022-02-25 14:25:33 +0100351 </xsl:result-document>
Akron9a8ee3e2022-01-31 13:51:49 +0100352 </xsl:template>
353
bansp5f841732022-03-16 06:27:31 +0100354 <!-- ************************** struct ******************* -->
355
356 <xsl:template name="create_struct">
banspe726b4a2022-03-28 05:47:45 +0200357 <xsl:param name="compoundID" as="xs:string"/>
bansp5f841732022-03-16 06:27:31 +0100358 <xsl:param name="ann_segmentation.xml" as="document-node()"/>
359 <xsl:param name="target" as="xs:string"/>
Piotr Banski4f4c2d22022-05-19 01:44:32 +0200360
bansp5f841732022-03-16 06:27:31 +0100361 <xsl:result-document encoding="UTF-8" method="xml" indent="yes"
362 xpath-default-namespace="http://ids-mannheim.de/ns/KorAP" href="{$target}">
363 <xsl:processing-instruction name="xml-model">href=&quot;span.rng&quot; type=&quot;application/xml&quot; schematypens=&quot;http://relaxng.org/ns/structure/1.0&quot;</xsl:processing-instruction>
364 <xsl:element name="layer" namespace="{$KorAP_namespace}">
365 <xsl:attribute name="docid" select="$compoundID"/>
366 <xsl:attribute name="version" select="$KorAP-XML_version"/>
367
368 <xsl:element name="spanList" namespace="{$KorAP_namespace}">
Piotr Banski09096ee2022-05-25 13:41:03 +0200369 <xsl:apply-templates select="$ann_segmentation.xml//tei:text" mode="struct"/>
bansp5f841732022-03-16 06:27:31 +0100370 </xsl:element>
371 </xsl:element>
372 </xsl:result-document>
373 </xsl:template>
374
375 <xsl:template match="tei:*" mode="struct">
Piotr Banski09096ee2022-05-25 13:41:03 +0200376 <xsl:variable name="offsets" as="xs:integer+">
377 <xsl:variable name="akku"
378 select="map:merge(tail(fn:accumulator-after('elem-offset-seq')), map {'duplicates': 'use-last'})"
379 as="map(xs:string,xs:integer+)"/> <!--test later if the merger is really needed here, given how accus work-->
380 <xsl:sequence select="map:get($akku, string(@xml:id))"/>
381 </xsl:variable>
Piotr Banski6a4a2522022-05-24 01:16:47 +0200382
bansp5f841732022-03-16 06:27:31 +0100383 <xsl:variable name="my_name" select="local-name()" as="xs:string"/>
Piotr Banski09096ee2022-05-25 13:41:03 +0200384 <xsl:variable name="my_index" select="fn:accumulator-before('element-index')" as="xs:integer"/>
bansp3e5b20c2022-03-18 20:22:31 +0100385
bansp5f841732022-03-16 06:27:31 +0100386 <xsl:element name="span" namespace="{$KorAP_namespace}">
387 <xsl:attribute name="id" select="'s' || $my_index"/>
Piotr Banski09096ee2022-05-25 13:41:03 +0200388 <xsl:attribute name="from" select="$offsets[1]"/>
389 <xsl:attribute name="to" select="$offsets[2]"/>
bansp5f841732022-03-16 06:27:31 +0100390 <xsl:attribute name="l" select="f:compute_nesting(.)"/>
Piotr Banski09096ee2022-05-25 13:41:03 +0200391 <xsl:if test="local-name() eq 'seg' and $SHOW_ORTH_IN_STRUCT">
392 <xsl:comment><xsl:value-of select="fn:normalize-space(.)"/></xsl:comment>
393 </xsl:if>
bansp5f841732022-03-16 06:27:31 +0100394 <xsl:element name="fs" namespace="http://www.tei-c.org/ns/1.0">
Piotr Banskifdc858a2022-05-25 02:40:32 +0200395 <xsl:attribute name="type" select="'struct'"></xsl:attribute> <!-- STRUCT vs. LEX for morpho -->
bansp5f841732022-03-16 06:27:31 +0100396 <xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
bansp3e5b20c2022-03-18 20:22:31 +0100397 <xsl:attribute name="name" select="'name'"/>
398 <xsl:value-of select="local-name()"/>
bansp5f841732022-03-16 06:27:31 +0100399 </xsl:element>
400 <xsl:if test="count(@*)">
401 <xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
402 <xsl:attribute name="name" select="'attr'"/>
403 <xsl:element name="fs" namespace="http://www.tei-c.org/ns/1.0">
404 <xsl:attribute name="type" select="'attr'"/>
405 <xsl:for-each select="@*">
406 <xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
407 <xsl:attribute name="name" select="local-name(.)"/>
408 <xsl:value-of select="."/>
409 </xsl:element>
410 </xsl:for-each>
411 </xsl:element>
412 </xsl:element>
413 </xsl:if>
414 </xsl:element>
415 </xsl:element>
Piotr Banskia51907c2022-05-25 15:09:41 +0200416 <xsl:apply-templates mode="struct"/>
bansp5f841732022-03-16 06:27:31 +0100417 </xsl:template>
418
419 <!-- ************************** morpho ******************* -->
420
421 <xsl:template name="create_morpho">
banspe726b4a2022-03-28 05:47:45 +0200422 <xsl:param name="compoundID" as="xs:string"/>
bansp3e5b20c2022-03-18 20:22:31 +0100423 <xsl:param name="ann_segmentation.xml" as="document-node()"/>
bansp5f841732022-03-16 06:27:31 +0100424 <xsl:param name="ann_morphosyntax.xml" as="document-node()"/>
425 <xsl:param name="target" as="xs:string"/>
426
427 <xsl:result-document encoding="UTF-8" method="xml" indent="yes"
428 xpath-default-namespace="http://ids-mannheim.de/ns/KorAP" href="{$target}">
429 <xsl:processing-instruction name="xml-model">href=&quot;span.rng&quot; type=&quot;application/xml&quot; schematypens=&quot;http://relaxng.org/ns/structure/1.0&quot;</xsl:processing-instruction>
bansp3e5b20c2022-03-18 20:22:31 +0100430 <xsl:element name="layer" namespace="{$KorAP_namespace}">
431 <xsl:attribute name="docid" select="$compoundID"/>
432 <xsl:attribute name="version" select="$KorAP-XML_version"/>
433
434 <xsl:element name="spanList" namespace="{$KorAP_namespace}">
435 <xsl:apply-templates select="$ann_segmentation.xml//tei:text" mode="morpho">
Piotr Banskia51907c2022-05-25 15:09:41 +0200436 <xsl:with-param name="ann_morphosyntax.xml" select="$ann_morphosyntax.xml" as="document-node()" tunnel="yes"/>
bansp3e5b20c2022-03-18 20:22:31 +0100437 </xsl:apply-templates>
438 </xsl:element>
439 </xsl:element>
bansp5f841732022-03-16 06:27:31 +0100440 </xsl:result-document>
441 </xsl:template>
442
bansp3e5b20c2022-03-18 20:22:31 +0100443 <xsl:template match="tei:seg" mode="morpho">
Piotr Banskia51907c2022-05-25 15:09:41 +0200444 <xsl:param name="ann_morphosyntax.xml" as="document-node()" tunnel="yes"/>
445 <!-- it's so spread out because I wanted to make sure to be able to look up the individual
446 constituent values, should anything go wrong; it might get compacted at some point, but
447 the increase in efficiency will probably be minimal, compared to the decrease of readability -->
448 <xsl:variable name="offsets" as="xs:integer+">
449 <xsl:variable name="akku"
450 select="map:merge(tail(fn:accumulator-after('elem-offset-seq')), map {'duplicates': 'use-last'})"
451 as="map(xs:string,xs:integer+)"/> <!--test later if the merger is really needed here, given how accus work-->
452 <xsl:sequence select="map:get($akku, string(@xml:id))"/>
453 </xsl:variable>
bansp3e5b20c2022-03-18 20:22:31 +0100454 <xsl:variable name="my_name" select="local-name()" as="xs:string"/>
455 <xsl:variable name="my_id" select="@xml:id" as="xs:string"/>
456 <xsl:variable name="my_morph-seg" as="node()" select="$ann_morphosyntax.xml//tei:seg[substring-after(@corresp,'#') eq $my_id]"/>
457 <xsl:variable name="my_disamb" select="$my_morph-seg//tei:fs/tei:f[@name eq 'disamb']" as="node()"/>
458 <xsl:variable name="my_choice-id" select="substring-after($my_disamb//tei:f[@name eq 'choice']/@fVal,'#')" as="xs:string"/>
459 <xsl:variable name="my_choice-lex" select="$my_morph-seg//tei:f[@name eq 'interps']/tei:fs[@type eq 'lex'][descendant::tei:symbol[@xml:id eq $my_choice-id]]" as="node()"/>
460 <xsl:variable name="chosen-msd" as="xs:string" select="$my_choice-lex/descendant::tei:symbol[@xml:id eq $my_choice-id]/@value"/>
Piotr Banskia51907c2022-05-25 15:09:41 +0200461 <xsl:variable name="my_index" select="fn:accumulator-before('element-index')" as="xs:integer"/>
bansp3e5b20c2022-03-18 20:22:31 +0100462
bansp3e5b20c2022-03-18 20:22:31 +0100463 <xsl:element name="span" namespace="{$KorAP_namespace}">
Piotr Banskia51907c2022-05-25 15:09:41 +0200464 <xsl:attribute name="id" select="'m' || $my_index"/>
465 <xsl:attribute name="from" select="$offsets[1]"/>
466 <xsl:attribute name="to" select="$offsets[2]"/>
bansp3e5b20c2022-03-18 20:22:31 +0100467 <xsl:attribute name="l" select="f:compute_nesting(.)"/>
468 <xsl:element name="fs" namespace="http://www.tei-c.org/ns/1.0">
469 <xsl:attribute name="type" select="'lex'"/>
470 <xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
471 <xsl:attribute name="name" select="'lex'"/>
472 <xsl:element name="fs" namespace="http://www.tei-c.org/ns/1.0">
473 <xsl:comment select="$my_morph-seg//tei:fs/tei:f[@name eq 'orth']/tei:string"/>
Piotr Banskia51907c2022-05-25 15:09:41 +0200474
bansp3e5b20c2022-03-18 20:22:31 +0100475 <xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
476 <xsl:attribute name="name" select="'lemma'"/>
477 <xsl:value-of select="$my_choice-lex/tei:f[@name eq 'base']/tei:string"/>
478 </xsl:element>
479 <xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
480 <xsl:attribute name="name" select="'pos'"/>
481 <xsl:value-of select="$my_choice-lex/tei:f[@name eq 'ctag']/tei:symbol/@value"/>
482 </xsl:element>
483 <xsl:if test="string-length($chosen-msd)">
484 <xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
485 <xsl:attribute name="name" select="'msd'"/>
486 <xsl:value-of select="$chosen-msd"/>
487 </xsl:element>
488 </xsl:if>
489 <xsl:if test="$my_morph-seg//tei:fs/tei:f[@name eq 'nps']">
490 <xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
491 <xsl:attribute name="name" select="'join'"/>
492 <xsl:value-of select="'left'"/>
493 </xsl:element>
494 </xsl:if>
495 </xsl:element>
496 </xsl:element>
497 </xsl:element>
498 </xsl:element>
bansp3e5b20c2022-03-18 20:22:31 +0100499 </xsl:template>
banspe726b4a2022-03-28 05:47:45 +0200500
bansp5f841732022-03-16 06:27:31 +0100501 <!-- ************************** TEXT header ******************* -->
502
503 <xsl:template name="create_text_header">
504 <xsl:param name="text.xml" as="document-node()"/>
banspe726b4a2022-03-28 05:47:45 +0200505 <xsl:param name="compoundID" as="xs:string"/>
bansp5f841732022-03-16 06:27:31 +0100506 <xsl:param name="target" as="xs:string"/>
507
508 <!-- create the local header.xml file -->
509 <xsl:result-document encoding="UTF-8" method="xml" indent="yes"
510 xpath-default-namespace="http://ids-mannheim.de/ns/KorAP" href="{$target}">
511
512 <idsHeader type="document" pattern="text" status="new" version="1.1" TEIform="teiHeader">
banspe726b4a2022-03-28 05:47:45 +0200513 <xsl:apply-templates select="$text.xml//tei:TEI/tei:teiHeader/tei:*" mode="text">
514 <xsl:with-param name="compoundID" as="xs:string" select="$compoundID" tunnel="yes"/>
515 </xsl:apply-templates>
bansp5f841732022-03-16 06:27:31 +0100516 </idsHeader>
517 </xsl:result-document>
518 </xsl:template>
519
520 <xsl:template match="tei:fileDesc" mode="text">
bansp9103aab2022-03-19 05:10:21 +0100521 <xsl:element name="{local-name()}">
bansp5f841732022-03-16 06:27:31 +0100522 <xsl:apply-templates mode="text"/>
bansp9103aab2022-03-19 05:10:21 +0100523 </xsl:element>
bansp5f841732022-03-16 06:27:31 +0100524 </xsl:template>
525
526 <xsl:template match="tei:title" mode="text">
527 <t.title>
528 <xsl:apply-templates/>
529 </t.title>
530 </xsl:template>
531
532 <xsl:template match="tei:titleStmt" mode="text">
banspe726b4a2022-03-28 05:47:45 +0200533 <xsl:param name="compoundID" as="xs:string" tunnel="yes"/>
bansp5f841732022-03-16 06:27:31 +0100534 <titleStmt>
535 <textSigle>
banspe726b4a2022-03-28 05:47:45 +0200536 <xsl:value-of select="$compoundID"/>
bansp5f841732022-03-16 06:27:31 +0100537 </textSigle>
538 <xsl:apply-templates mode="text"/>
539 </titleStmt>
540 </xsl:template>
541
bansp9103aab2022-03-19 05:10:21 +0100542 <xsl:template match="tei:publicationStmt" mode="text">
543 <xsl:element name="{local-name()}">
544 <xsl:apply-templates mode="text"/>
545 </xsl:element>
546 </xsl:template>
547
548 <xsl:template match="tei:availability" mode="text">
549 <xsl:element name="{local-name()}">
550 <xsl:apply-templates mode="text" select="@* | *"/>
551 </xsl:element>
552 </xsl:template>
553
554 <xsl:template match="tei:profileDesc" mode="text">
555 <xsl:element name="{local-name()}">
556 <xsl:apply-templates mode="text"/>
557 </xsl:element>
558 </xsl:template>
bansp5f841732022-03-16 06:27:31 +0100559
bansp9103aab2022-03-19 05:10:21 +0100560 <xsl:template match="tei:textClass" mode="text">
561 <xsl:element name="{local-name()}">
562 <xsl:apply-templates mode="text" select="@* | *"/>
563 </xsl:element>
564 </xsl:template>
565
566 <xsl:template match="tei:catRef" mode="text corpus">
567 <xsl:element name="{local-name()}">
568 <xsl:apply-templates mode="text" select="@* | *"/>
569 </xsl:element>
570 </xsl:template>
571
572 <xsl:template match="@status | @scheme | @target | @type | @xml:id[ancestor::tei:classDecl] | @xml:lang" mode="text corpus">
573 <xsl:copy-of select="."/>
574 </xsl:template>
575
576 <xsl:template match="tei:p" mode="text corpus">
577 <xsl:element name="{local-name()}">
578 <xsl:apply-templates mode="header-text"/>
579 </xsl:element>
580 </xsl:template>
581
582
583 <!-- OPTIMIZATION has to take modes into account -->
bansp5e2d1c02022-03-10 04:51:40 +0100584 <!-- ************************** CORPUS header ******************* -->
585 <xsl:template name="create_corpus_header">
586 <xsl:param name="text.xml" as="document-node()"/>
bansp5f841732022-03-16 06:27:31 +0100587 <xsl:param name="target" as="xs:string"/>
bansp5e2d1c02022-03-10 04:51:40 +0100588
589 <!-- create the corpus-level header.xml file -->
bansp5f841732022-03-16 06:27:31 +0100590 <xsl:result-document encoding="UTF-8" method="xml" indent="yes" href="{$target}">
bansp5e2d1c02022-03-10 04:51:40 +0100591
592 <!--doctype-public="{$publicDoctypeI5}"
593 doctype-system="{$systemDoctypeI5}">
594 these are, sadly, useless
595 -->
596
597 <idsHeader type="corpus" pattern="text" status="new" version="1.1" TEIform="teiHeader">
bansp9103aab2022-03-19 05:10:21 +0100598 <xsl:apply-templates select="$text.xml/tei:teiCorpus/tei:teiHeader/tei:*" mode="corpus"/>
bansp5e2d1c02022-03-10 04:51:40 +0100599 </idsHeader>
600 </xsl:result-document>
601 </xsl:template>
602
603 <xsl:template match="tei:fileDesc" mode="corpus">
bansp9103aab2022-03-19 05:10:21 +0100604 <xsl:element name="{local-name()}">
bansp5e2d1c02022-03-10 04:51:40 +0100605 <xsl:apply-templates mode="corpus"/>
bansp9103aab2022-03-19 05:10:21 +0100606 </xsl:element>
bansp5e2d1c02022-03-10 04:51:40 +0100607 </xsl:template>
bansp9103aab2022-03-19 05:10:21 +0100608
bansp5e2d1c02022-03-10 04:51:40 +0100609
610 <xsl:template match="tei:title" mode="corpus">
611 <c.title>
bansp9103aab2022-03-19 05:10:21 +0100612 <xsl:apply-templates mode="corpus" select="@*"/>
613 <xsl:apply-templates mode="header-text"/>
bansp5e2d1c02022-03-10 04:51:40 +0100614 </c.title>
615 </xsl:template>
616
617 <xsl:template match="tei:titleStmt" mode="corpus">
618 <titleStmt>
619 <korpusSigle>
620 <xsl:value-of select="$corpusID"/>
621 </korpusSigle>
622 <xsl:apply-templates mode="corpus"/>
623 </titleStmt>
624 </xsl:template>
625
bansp9103aab2022-03-19 05:10:21 +0100626 <xsl:template match="tei:publicationStmt" mode="corpus">
627 <xsl:element name="{local-name()}">
628 <xsl:apply-templates mode="corpus"/>
629 </xsl:element>
630 </xsl:template>
631
632 <xsl:template match="tei:availability" mode="corpus">
633 <xsl:element name="{local-name()}">
634 <xsl:apply-templates mode="corpus" select="@* | *"/>
635 </xsl:element>
636 </xsl:template>
637
638 <xsl:template match="tei:encodingDesc" mode="corpus">
639 <xsl:element name="{local-name()}">
640 <xsl:apply-templates mode="corpus"/>
641 </xsl:element>
642 </xsl:template>
643
644 <xsl:template match="tei:classDecl | tei:taxonomy | tei:category | tei:taxonomy/tei:bibl" mode="corpus">
645 <xsl:element name="{local-name()}">
646 <xsl:apply-templates mode="corpus" select="@* | *"/>
647 </xsl:element>
648 </xsl:template>
649
650 <xsl:template match="tei:bibl/tei:title | tei:edition | tei:desc" mode="corpus">
651 <xsl:element name="{local-name()}">
652 <xsl:apply-templates mode="corpus" select="@*"/>
653 <xsl:apply-templates mode="header-text"/>
654 </xsl:element>
655 </xsl:template>
656<!--
657 <xsl:template match="tei:textClass" mode="corpus">
658 <xsl:element name="{local-name()}">
659 <xsl:apply-templates mode="corpus" select="@* | *"/>
660 </xsl:element>
661 </xsl:template>
662
663 <xsl:template match="tei:catRef" mode="corpus">
664 <xsl:element name="{local-name()}">
665 <xsl:apply-templates mode="corpus" select="@* | *"/>
666 </xsl:element>
667 </xsl:template>
668-->
bansp5e2d1c02022-03-10 04:51:40 +0100669
670
671
672 <!-- this template can be called by the XSPEC test; TODO: find a way to call the main() template directly -->
673 <!-- I have not fully handled the param transmission, which would have to be kludged in just for the sake of XSPec,
674 because I'm disabling this for now, due to XSpec design issues; relevant links, a.o.:
675
676 https://stackoverflow.com/questions/64933277/what-is-the-cause-of-error-cannot-execute-xslresult-document-while-evaluating
677 https://www.balisage.net/Proceedings/vol25/html/Galtman01/BalisageVol25-Galtman01.html
678
679 In short: the internal design of XSpec forces kludges when one wants to use xsl:result-document in their stylesheets. But I don't
680 want to be strangled by kludges at the beginning of work, I've already lost quite a bit of time on this investigation,
681 I will therefore "just code" and then can think of externalizing bits of templates if we want to play with tests. For now,
682 I don't want to have to handle context items is a special way inside variables, etc., because I'm not sure it's worth it.
683
684 -->
685 <!--<xsl:template name="test_full">
686 <xsl:param name="corpusID"/>
687 <xsl:param name="docID"/>
688 <xsl:param name="textID"/>
689 <xsl:call-template name="xsl:initial-template"/>
690 </xsl:template>-->
691
Akron9a8ee3e2022-01-31 13:51:49 +0100692</xsl:stylesheet>
Piotr Banski6a4a2522022-05-24 01:16:47 +0200693
Piotr Banskifdc858a2022-05-25 02:40:32 +0200694<!-- template for serializing maps in messages <xsl:message select="('map:',serialize($map, map{'method':'adaptive'}))"/> -->