-
Notifications
You must be signed in to change notification settings - Fork 0
/
xml2FLExTextModInOut.xsl
143 lines (125 loc) · 6.06 KB
/
xml2FLExTextModInOut.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="xs" version="3.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<!-- Larry Hayashi March 20 2024 -->
<xsl:param name="pVernacularLgCode"/>
<xsl:param name="pAnalysisLgCode"/>
<!-- Possible values: AUD - Audacity - Seconds.decimal_places
ELAN - Hours:Min:Seconds.Decimal_places-->
<xsl:param name="pOffSetType"/>
<xsl:template match="document">
<!--<xsl:variable name="vRandom-seed" select="random-number-generator()"/>-->
<!--<xsl:variable name="vRandom-seed" select="generate-id()"/>-->
<xsl:variable name="vRandom-number" select="generate-id()"/>
<!--<xsl:variable name="vRandom-number"
select="format-number(($vRandom-seed('permute')((current-dateTime() - xs:dateTime('1970-01-01T00:00:00Z')) div xs:dayTimeDuration('PT1S')) mod 10000000), '0000000')"/>-->
<xsl:variable name="vMediaFileGUID" select="$vRandom-number"/>
<!-- Sometimes a flextext file will contain multiple flextexts from different texts inside the project.
Each one might have its own associated sound or video file.
So here, we crawl through the entire flextext <document>
looking for each <interlinear-text>.
We get the sound file listed, usually in the 1st segment of the text in the InOut field with a \sf.-->
<xsl:for-each select="interlinear-text">
<xsl:variable name="vTextTitle" select="item[@type='title'][@lang=$pVernacularLgCode]/text()"/>
<xsl:result-document method="xml"
href="{concat($vTextTitle,'.flextext')}" indent="yes">
<document>
<xsl:copy-of select="../@*"/>
<interlinear-text>
<!--<xsl:variable name="vMediaFileName" select="paragraphs/paragraph/phrases/phrase/item[@type='InOut'][contains(text(),'\sf ')]/substring-after(text(), 'sf ')"/>-->
<xsl:variable name="vMediaFileName"
select=".//item[@type = 'InOut'][contains(., '\sf ')]/substring-after(., 'sf ')"/>
<xsl:copy-of select="@*"/>
<xsl:apply-templates>
<xsl:with-param name="pMediaFileGUID" select="$vMediaFileGUID"/>
</xsl:apply-templates>
<xsl:call-template name="media-files">
<xsl:with-param name="pMediaFileGUID" select="$vMediaFileGUID"/>
<xsl:with-param name="pMediaFileName" select="$vMediaFileName"/>
</xsl:call-template>
</interlinear-text>
</document>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="phrase">
<xsl:param name="pMediaFileGUID"/>
<!-- vPOS stores the position of the current phrase among phrases-->
<xsl:variable name="vPOS">
<xsl:number count="phrase" level="any" format="1"/>
</xsl:variable>
<!--<xsl:variable name="vMediaFileName" select="normalize-space(substring-before(substring-after(concat(item[@type = 'note'], '\'), '\sf '), '\'))"/>-->
<xsl:copy>
<!--The goal of this transform is to have reconciled user-edited offsets (captured in Notes on text segments
with the attributes on phrase xml in FLExText.-->
<!-- If there is a custom field InOut with the segment then
copy the value of the \in to begin-time-offset
copy the value of the \out to end-time-offset
and if there is \sf then copy to media-file attribute-->
<!-- The user can modify the InOut data if needed
so this transform copies the InOut data over any existing data in these begin-time-offset and end-time-offset.-->
<!--If for some reason there is no InOut custom field but there are @begin-time-offset and end-time-offset
then create an InOut custom field with those offsets stored as \in, \out and \sf.-->
<!-- Floor() rounds down to nearest integer.-->
<!-- Export / Copy InOut custom field data to begin-time-offset and end-time-offset
Use pOffSetType to determine conversion. The FLExText format expects total milliseconds -->
<xsl:if test="item[@type = 'InOut']">
<xsl:variable name="vInOffSet">
</xsl:variable>
<xsl:choose>
<xsl:when test="$pOffSetType = 'AUD'">
<xsl:attribute name="begin-time-offset">
<xsl:value-of
select="floor(number(normalize-space(substring-before(substring-after(item[@type = 'InOut'], '\in '), '\out'))) * 1000)"
/>
</xsl:attribute>
<xsl:attribute name="end-time-offset">
<xsl:value-of
select="floor(number(normalize-space(substring-before(substring-after(concat(item[@type = 'InOut'], '\'), '\out '), '\'))) * 1000)"
/>
</xsl:attribute>
</xsl:when>
<xsl:when test="$pOffSetType='ELAN'">
<xsl:attribute name="begin-time-offset">
<xsl:value-of
select="floor(number(normalize-space(substring-before(substring-after(item[@type = 'InOut'], '\in '), '\out'))) * 1000)"
/>
</xsl:attribute>
<xsl:attribute name="end-time-offset">
<xsl:value-of
select="floor(number(normalize-space(substring-before(substring-after(concat(item[@type = 'InOut'], '\'), '\out '), '\'))) * 1000)"
/>
</xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:attribute name="media-file" select="$pMediaFileGUID"/>
</xsl:if>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="media-files"/><!-- Destroys original media-files elements-->
<xsl:template name="media-files">
<xsl:param name="pMediaFileName"/>
<xsl:param name="pMediaFileGUID"/>
<media-files offset-type="">
<media>
<xsl:attribute name="guid" select="$pMediaFileGUID"/>
<xsl:attribute name="location" select="$pMediaFileName"/>
</media>
</media-files>
</xsl:template>
<!--<xsl:template match="item[@type='note'][starts-with(., '\in')]"/>-->
<xsl:template match="*">
<!-- Declare the parameter so it can be used within this template -->
<xsl:param name="pMediaFileGUID"/>
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates>
<!-- Pass the parameter to the next level of applied templates -->
<xsl:with-param name="pMediaFileGUID" select="$pMediaFileGUID"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>