-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmilestone-parser.xsl
73 lines (65 loc) · 4.34 KB
/
milestone-parser.xsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://www.tei-c.org/ns/1.0" version="2.0">
<!-- milestone parser
parst ein XML nach milestone-Elementen, die paarweise verschachtelt gesetzt sind, wobei das abschließende Element mit @rend="closer" markiert ist und das eröffnende eine @xml:id besitzt. Die paarweise Zuordnung wird explizit gemacht, indem dem anschließenden Element ein @corresp auf die zugehörige xml:id vergeben wird.
When creating alternative markup (e.g. for overlap) the TEI suggests to use `milestone` to markup start and end of text ranges. It is sometimes useful to make the correspondence between the two empty elements explicit (e.g. for faster parsing). This xsl adds @corresp into a correctly nested milestone structure, i.e. it assumes that every opening milestone has a corresponding closing milestone and that they form a strict hierarchy. It assumes additionally, that the opening milestone is identified by a @xml:id.
Georg Vogeler, [email protected], 2020-04-28
-->
<!-- ToDo:
TEI namespace hinzufügen
Wird generischer, wenn man die @unit mit einbezieht
-->
<xsl:param name="close-identifier"><attributeName>rend</attributeName><attributeValue>closer</attributeValue></xsl:param>
<xsl:param name="unit"><!-- not yet implemented --></xsl:param>
<xsl:template match="tei:milestone[@*[name()=$close-identifier/attributeName]=$close-identifier/attributeValue]">
<xsl:variable name="my-opener">
<xsl:call-template name="find-opener">
<xsl:with-param name="depth">0</xsl:with-param>
<xsl:with-param name="current" select="."/>
</xsl:call-template>
</xsl:variable>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:if test="not(@xml:id)"><xsl:attribute name="xml:id" select="generate-id()"/></xsl:if><!-- eine xml:id ist immer praktisch, aber nicht notwendig für den Code -->
<xsl:attribute name="corresp" select="$my-opener/*/@xml:id"/>
</xsl:copy>
</xsl:template>
<!-- die eigentliche Rekursion:
tests the preceding milestone, if it is a opener to finish the current recursion step by either finishing recursion completely or continue search with next preceding milestone. If preceding milestone is another closer the recursion goes one step deeper -->
<xsl:template name="find-opener">
<xsl:param name="depth">0</xsl:param>
<xsl:param name="current" select="."/>
<xsl:variable name="prev" select="$current/preceding::tei:milestone[1]"/>
<xsl:choose>
<xsl:when test="$prev[@*[name()=$close-identifier/attributeName]=$close-identifier/attributeValue]">
<!-- der vorangehende milestone ist auch ein closer, also muß ich die Rekursion um eins vertiefen (depth+1) -->
<xsl:call-template name="find-opener">
<xsl:with-param name="depth" select="number($depth) + 1"/>
<xsl:with-param name="current" select="$prev"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- ich habe einen opener gefunden, und muss prüfen, ob das nur einer innerhalb einer Verschachtelung ist (depth > 0), oder schon "meiner" (depth=0) -->
<xsl:choose>
<xsl:when test="number($depth)=0">
<!-- Ich habe mit der Rekursion gerade erst angefangen und bin schon fertig: -->
<xsl:copy-of select="$prev"/>
</xsl:when>
<xsl:otherwise>
<!-- the found opener corresponds to a closer preceding the closer we are interested in, so we can throw it away (depth-1) and check the milestone preceding this one -->
<xsl:call-template name="find-opener">
<xsl:with-param name="depth" select="number($depth) - 1"/>
<xsl:with-param name="current" select="$prev"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- all other nodes can simply be copied -->
<xsl:template match="node()|@*" priority="-2">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>