cleaned up, before adding more info to morpho
Change-Id: Ia6ee0a1dc5ba825ea3f979fc3a410eed5c9842e7
diff --git a/nkjp2korap.xsl b/nkjp2korap.xsl
index d2d8bc0..9bd3ce6 100644
--- a/nkjp2korap.xsl
+++ b/nkjp2korap.xsl
@@ -27,7 +27,11 @@
(this is just for testing) -->
<xsl:param name="SHOW_ORTH_IN_STRUCT" as="xs:boolean" select="true()"/>
- <!-- for debugging structure.xml production -->
+ <!-- for debugging structure.xml production; otherwise we don't see the referenced span -->
+
+ <xsl:param name="SHOW_REDUNDANT_ORTH" as="xs:boolean" select="true()"/>
+ <!-- in layers such as morpho or named, one can recover the orth, so this is a bit of
+ space-wasting luxury, useful at the early stages -->
<!-- VARIABLES (= constants...) -->
@@ -59,6 +63,7 @@
<!-- MODES -->
<xsl:mode name="struct" on-no-match="deep-skip"/>
+ <xsl:mode name="morpho" on-no-match="deep-skip"/>
<xsl:mode name="corpus-header" on-no-match="deep-skip"/>
<xsl:mode name="text-header" on-no-match="deep-skip"/>
<xsl:mode name="text_inside_header" on-no-match="text-only-copy"/>
@@ -66,12 +71,12 @@
<xsl:mode use-accumulators="#all"/>
<xsl:accumulator name="element-index" as="xs:integer" initial-value="0">
- <xsl:accumulator-rule match="tei:*[ancestor-or-self::tei:text]" select="$value + 1" phase="start"/>
+ <!--<xsl:accumulator-rule match="tei:*[ancestor-or-self::tei:text]" select="$value + 1" phase="start"/>-->
+ <xsl:accumulator-rule
+ match="tei:teiCorpus/tei:TEI/(tei:text | tei:text/tei:body | tei:text/tei:body/tei:p | tei:text/tei:body/tei:p/tei:s | tei:text/tei:body/tei:p/tei:s/tei:seg)"
+ select="$value + 1" phase="start"/>
</xsl:accumulator>
-
-
-
- <!--I think I may be able to actually merge the two accumulators, but let's see-->
+
<xsl:accumulator name="morpho-offsets" as="map(xs:string, item()+)+" initial-value="(map{'null':(0,0)})">
<xsl:accumulator-rule match="tei:body/tei:p" phase="start">
@@ -89,7 +94,7 @@
string(@xml:id): ($preceding_index,$our_base)
}"/>
</xsl:accumulator-rule>
- <!-- this is morpho-offsets -->
+
<xsl:accumulator-rule match="tei:s" phase="start">
<xsl:variable name="preceding_index" as="xs:integer">
<xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
@@ -103,7 +108,6 @@
string(@xml:id): ($preceding_index,$our_base)
}"/>
</xsl:accumulator-rule>
- <!-- this is morpho-offsets -->
<!-- I want something that won't be matched in other layers, for efficiency - that
may allow me to merge the accumulators, eventually;
@@ -123,7 +127,7 @@
}"/>
</xsl:accumulator-rule>
- <!-- this is morpho-offsets -->
+
<xsl:accumulator-rule match="tei:s" phase="end">
<xsl:variable name="preceding_index" as="xs:integer">
<xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
@@ -141,7 +145,7 @@
string(@xml:id): ($our_base,$preceding_index)
}"/>
</xsl:accumulator-rule>
- <!-- this is morpho-offsets -->
+
<xsl:accumulator-rule match="tei:body/tei:p" phase="end">
<xsl:variable name="preceding_index" as="xs:integer">
<xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
@@ -159,117 +163,7 @@
string(@xml:id): ($our_base,$preceding_index)
}"/>
</xsl:accumulator-rule>
-
- <xsl:accumulator-rule match="tei:body" phase="end">
- <xsl:variable name="preceding_index" as="xs:integer">
- <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
- <xsl:sequence select="map:get($the_tail, map:keys($the_tail)[1])[2]"/>
- </xsl:variable>
-
- <xsl:sequence select="
- $value,
- map {
- string(@xml:id): (0, $preceding_index)
- }"/>
- </xsl:accumulator-rule>
-
- <xsl:accumulator-rule match="tei:text" phase="end">
- <xsl:variable name="preceding_index" as="xs:integer">
- <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
- <xsl:sequence select="map:get($the_tail, map:keys($the_tail)[1])[2]"/>
- </xsl:variable>
-
- <xsl:sequence select="
- $value,
- map {
- string(@xml:id): (0, $preceding_index)
- }"/>
- </xsl:accumulator-rule>
-
- </xsl:accumulator>
- <xsl:accumulator name="segmentation-offsets" as="map(xs:string, item()+)+" initial-value="(map{'null':(0,0)})">
-
- <xsl:accumulator-rule match="tei:body/tei:p" phase="start">
- <xsl:variable name="preceding_index" as="xs:integer">
- <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
- <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
- </xsl:variable>
-
- <xsl:variable name="our_base" as="xs:integer" select="if($preceding_index eq 0) then $preceding_index else $preceding_index + 1"/>
- <!-- for paragraphs, it's in either being initial or not -->
-
- <xsl:sequence select="
- $value,
- map {
- string(@xml:id): ($preceding_index,$our_base)
- }"/>
- </xsl:accumulator-rule>
-
- <xsl:accumulator-rule match="tei:s" phase="start">
- <xsl:variable name="preceding_index" as="xs:integer">
- <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
- <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
- </xsl:variable>
- <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()))"/>
-
- <xsl:sequence select="
- $value,
- map {
- string(@xml:id): ($preceding_index,$our_base)
- }"/>
- </xsl:accumulator-rule>
-
- <xsl:accumulator-rule match="tei:w[parent::tei:seg[count(@nkjp:rejected) eq 0]]" phase="end">
- <xsl:variable name="preceding_index" as="xs:integer">
- <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
- <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
- </xsl:variable>
- <xsl:variable name="our_base" as="xs:integer" select="$preceding_index + xs:integer(f:is_preceded_by_ws(parent::tei:seg,true()))"/>
-
- <xsl:sequence select="
- $value,
- map {
- string(parent::tei:seg/@xml:id): ($our_base,$our_base + string-length())
- }"/>
- </xsl:accumulator-rule>
-
- <xsl:accumulator-rule match="tei:s" phase="end">
- <xsl:variable name="preceding_index" as="xs:integer">
- <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
- <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
-
- </xsl:variable>
- <xsl:variable name="our_base" as="xs:integer">
- <xsl:variable name="incomplete" select="map:find($value,string(@xml:id))(1)" as="xs:integer+"/>
- <xsl:sequence select="$incomplete[2]"/>
- </xsl:variable>
-
- <xsl:sequence select="
- $value,
- map {
- string(@xml:id): ($our_base,$preceding_index)
- }"/>
- </xsl:accumulator-rule>
-
- <xsl:accumulator-rule match="tei:body/tei:p" phase="end">
- <xsl:variable name="preceding_index" as="xs:integer">
- <xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
- <xsl:sequence select="map:get($the_tail,map:keys($the_tail)[1])[2]"/>
-
- </xsl:variable>
- <xsl:variable name="our_base" as="xs:integer">
- <xsl:variable name="incomplete" select="map:find($value,string(@xml:id))(1)" as="xs:integer+"/>
- <xsl:sequence select="$incomplete[2]"/>
- </xsl:variable>
-
- <xsl:sequence select="
- $value,
- map {
- string(@xml:id): ($our_base,$preceding_index)
- }"/>
- </xsl:accumulator-rule>
-
<xsl:accumulator-rule match="tei:body" phase="end">
<xsl:variable name="preceding_index" as="xs:integer">
<xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
@@ -282,7 +176,7 @@
string(@xml:id): (0, $preceding_index)
}"/>
</xsl:accumulator-rule>
-
+
<xsl:accumulator-rule match="tei:text" phase="end">
<xsl:variable name="preceding_index" as="xs:integer">
<xsl:variable name="the_tail" as="map(*)" select="head(reverse($value))"/>
@@ -295,6 +189,7 @@
string(@xml:id): (0, $preceding_index)
}"/>
</xsl:accumulator-rule>
+
</xsl:accumulator>
<!-- FUNCTIONS -->
@@ -314,11 +209,7 @@
<xsl:choose>
<xsl:when test="local-name($node) eq 'seg'">
<xsl:choose>
- <xsl:when test="$node/@nkjp:nps">
- <xsl:sequence select="fn:false()"/>
- </xsl:when>
<xsl:when test="$node/tei:fs/tei:f[@name eq 'nps']">
- <!--added for traversing ann_morphosyntax-->
<xsl:sequence select="fn:false()"/>
</xsl:when>
<xsl:when
@@ -327,13 +218,7 @@
<!-- the otherwise very costly check for preceding segs fires only if the first two are true, so it will have minimal search space -->
</xsl:when>
<xsl:when
- test="$suppress_initial and $node/ancestor::tei:s/descendant::tei:seg[count(@nkjp:rejected) eq 0][1]/@xml:id eq $node/@xml:id">
- <!-- I forget how node identity works now, so let me just compare the IDs -->
- <xsl:sequence select="fn:false()"/>
- </xsl:when>
- <xsl:when
test="$suppress_initial and $node/ancestor::tei:s/descendant::tei:seg[tei:fs/tei:f[@name eq 'disamb']][1]/@xml:id eq $node/@xml:id">
- <!--added for traversing ann_morphosyntax-->
<xsl:sequence select="fn:false()"/>
</xsl:when>
<xsl:otherwise>
@@ -370,18 +255,6 @@
<xsl:template match="@default" mode="#all"/>
<!-- this is to delete some auto-inserted attribute throughout -->
- <xsl:template match="tei:w" mode="#all"/>
-<!-- NKJP-SGJP has apparently resigned from standoff representations by adding <w> everywhere;
- we reach for them, but from the level of <seg>, so we don't need to process <w> separately -->
-
- <!-- fall-thru, skipping the potential <paren> element and filtering out the bad guys -->
- <xsl:template match="tei:choice" mode="struct">
- <xsl:apply-templates select="descendant::tei:seg[count(@nkjp:rejected) eq 0]" mode="struct"/>
- </xsl:template>
- <xsl:template match="tei:choice" mode="morpho">
- <xsl:apply-templates select="descendant::tei:seg[count(@nkjp:rejected) eq 0]" mode="morpho"/>
- </xsl:template>
-
<!-- MAIN PROCESSING -->
<xsl:template name="xsl:initial-template">
@@ -432,7 +305,6 @@
<xsl:template name="process_single_sample">
<xsl:param name="text.doc" as="document-node()"/>
<xsl:param name="ann_morphosyntax.doc" as="document-node()"/>
-<!-- <xsl:param name="ann_segmentation.xml" as="document-node()"/>-->
<xsl:param name="my_textID" as="xs:string" select="'0-BAD_textID'"/>
<!-- empty textID should never happen, but if it does, it will be signalled at the top of the output -->
<xsl:param name="ann_named.doc" as="document-node()*"/>
@@ -466,12 +338,7 @@
<xsl:with-param name="target" select="$targetBaseDir || '/nkjp/morpho.xml'" as="xs:string"/>
</xsl:call-template>
-<!--
-
- THESE ARE SAFE
-
-
- <xsl:call-template name="create_text_header">
+ <xsl:call-template name="create_text_header">
<xsl:with-param name="text.doc" select="$text.doc" as="document-node()"/>
<xsl:with-param name="compoundID" select="$compoundID" as="xs:string"/>
<xsl:with-param name="target" select="$targetBaseDir || '/header.xml'" as="xs:string"/>
@@ -482,8 +349,8 @@
<xsl:for-each
select="$ann_named.doc//tei:seg/tei:ptr">
<xsl:variable name="trg" as="xs:string" select="fn:substring-before(@target, '#')"/>
- <!-\- caution: as of 01-June-2022, some of the pointers are malformed (missing '#' when referencing locally).
- so we need to act around it but also sustainably - in case that error gets corrected -\->
+ <!-- caution: as of 01-June-2022, some of the pointers are malformed (missing '#' when referencing locally).
+ so we need to act around it but also sustainably - in case that error gets corrected -->
<xsl:if test="fn:string-length($trg) and $trg eq 'ann_morphosyntax.xml'">
<xsl:sequence>
@@ -505,7 +372,7 @@
<xsl:with-param name="rev_lookup" select="$rev_lookup" as="map(*)"/>
</xsl:call-template>
</xsl:if>
--->
+
<xsl:if test="$ann_words.doc and $ann_groups.doc">
<xsl:call-template name="create_groups">
<xsl:with-param name="compoundID" select="$compoundID" as="xs:string"/>
@@ -540,7 +407,6 @@
<xsl:element name="text" namespace="{$KorAP_namespace}">
<xsl:variable name="content" as="xs:string+">
- <!--<xsl:for-each select="$ann_morphosyntax.doc/tei:teiCorpus/tei:TEI/tei:text/tei:body/tei:p/tei:s//tei:seg[count(@nkjp:rejected) eq 0]">-->
<xsl:for-each select="$ann_morphosyntax.doc/tei:teiCorpus/tei:TEI/tei:text/tei:body/tei:p/tei:s/tei:seg[tei:fs/tei:f[@name eq 'disamb']]">
<xsl:sequence select="
if (f:is_preceded_by_ws(.,false())) then
@@ -590,7 +456,11 @@
<xsl:attribute name="to" select="$offsets[2]"/>
<xsl:attribute name="l" select="f:compute_nesting(.)"/>
<xsl:if test="local-name() eq 'seg' and $SHOW_ORTH_IN_STRUCT">
- <xsl:comment><xsl:value-of select="fn:normalize-space(.)"/></xsl:comment>
+ <xsl:comment select="
+ (if (tei:fs/tei:f[@name eq 'nps']) then
+ ' '
+ else
+ ' _') || tei:fs/tei:f[@name eq 'orth']/tei:string"/>
</xsl:if>
<xsl:element name="fs" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="type" select="'struct'"></xsl:attribute> <!-- STRUCT vs. LEX for morpho -->
@@ -632,7 +502,7 @@
<xsl:attribute name="version" select="$KorAP-XML_version"/>
<xsl:element name="spanList" namespace="{$KorAP_namespace}">
- <xsl:apply-templates select="$ann_morphosyntax.doc//tei:text" mode="morpho"/>
+ <xsl:apply-templates select="$ann_morphosyntax.doc/tei:teiCorpus/tei:TEI/tei:text/tei:body/tei:p/tei:s/tei:seg" mode="morpho"/>
</xsl:element>
</xsl:element>
</xsl:result-document>
@@ -647,8 +517,6 @@
<xsl:sequence select="map:get(fn:accumulator-after('morpho-offsets')[last()], string(@xml:id))"/>
</xsl:variable>
- <xsl:variable name="my_id" select="@xml:id" as="xs:string"/>
- <!--<xsl:variable name="my_morph-seg" as="node()" select="$ann_morphosyntax.doc//tei:seg[substring-after(@corresp,'#') eq $my_id]"/>-->
<xsl:variable name="my_disamb" select="tei:fs/tei:f[@name eq 'disamb']" as="node()"/>
<xsl:variable name="my_choice-id" select="substring-after($my_disamb//tei:f[@name eq 'choice']/@fVal,'#')" as="xs:string"/>
<xsl:variable name="my_choice-lex" select="tei:fs/tei:f[@name eq 'interps']/tei:fs[@type eq 'lex'][descendant::tei:symbol[@xml:id eq $my_choice-id]]" as="node()"/>
@@ -664,11 +532,13 @@
<xsl:attribute name="type" select="'lex'"/>
<xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="name" select="'lex'"/>
- <xsl:comment select="
+ <xsl:if test="$SHOW_REDUNDANT_ORTH">
+ <xsl:comment select="
(if (tei:fs/tei:f[@name eq 'nps']) then
' '
else
' _') || tei:fs/tei:f[@name eq 'orth']/tei:string"/>
+ </xsl:if>
<xsl:element name="fs" namespace="http://www.tei-c.org/ns/1.0">
<xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="name" select="'lemma'"/>
@@ -748,11 +618,13 @@
<xsl:attribute name="type" select="'ne'"/>
<xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="name" select="'ne'"/>
- <xsl:comment select="
- (if (tei:fs/tei:f[@name eq 'nps']) then
- ' '
- else
- ' _') || tei:fs/tei:f[@name eq 'orth']/tei:string"/>
+ <xsl:if test="$SHOW_REDUNDANT_ORTH">
+ <xsl:comment select="
+ (if (tei:fs/tei:f[@name eq 'nps']) then
+ ' '
+ else
+ ' _') || tei:fs/tei:f[@name eq 'orth']/tei:string"/>
+ </xsl:if>
<xsl:element name="fs" namespace="http://www.tei-c.org/ns/1.0">
<xsl:element name="f" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="name" select="'complex-ent'"/>
@@ -798,8 +670,7 @@
<xsl:attribute name="version" select="$KorAP-XML_version"/>
<xsl:element name="spanList" namespace="{$KorAP_namespace}">
- <!--<xsl:apply-templates select="$ann_segmentation.xml//tei:text" mode="groups">
- <xsl:with-param name="ann_morphosyntax.doc" select="$ann_morphosyntax.doc" as="document-node()" tunnel="yes"/>
+ <!--<xsl:apply-templates select="$ann_morphosyntax.doc//tei:text" mode="groups">
<xsl:with-param name="ann_words.doc" select="$ann_words.doc" as="document-node()" tunnel="yes"/>
<xsl:with-param name="ann_groups.doc" select="$ann_groups.doc" as="document-node()" tunnel="yes"/>
</xsl:apply-templates>-->