<!---->
<
xsl:
stylesheet xmlns:xsl="
http://www.w3.org/1999/XSL/Transform"
xmlns:local="
http://www.pantor.com/ns/local"
xmlns:a="
http://relaxng.org/ns/compatibility/annotations/1.0"
xmlns:exsl="
http://exslt.org/common"
xmlns:teix="
http://www.tei-c.org/ns/Examples"
xmlns:html="
http://www.w3.org/1999/xhtml"
xmlns="
http://www.tei-c.org/ns/1.0"
xmlns:edate="
http://exslt.org/dates-and-times"
xmlns:fo="
http://www.w3.org/1999/XSL/Format"
xmlns:xd="
http://www.pnp-software.com/XSLTdoc"
xmlns:rng="
http://relaxng.org/ns/structure/1.0"
xmlns:tei="
http://www.tei-c.org/ns/1.0"
xmlns:estr="
http://exslt.org/strings"
extension-element-prefixes="
exsl estr edate"
exclude-result-prefixes="
html xd exsl estr edate a fo local rng tei teix"
version="
1.0">
<
xd:
doc type="
stylesheet">
<
xd:
short>
Stylesheet for MULTEXT-East morphosyntactic specifications. Transform from
MULTEXT-East morphosyntactic specifications into TEI print format. particular specification
from common morphosyntactic tables. </
xd:
short>
<
xd:
author>
Tomaž Erjavec tomaz.erjavec@ijs.si</
xd:
author>
<
xd:
date>
2010-05-08</
xd:
date>
<
xd:
detail>
This library is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software Foundation;
either version 2.1 of the License, or (at your option) any later version. This library is
distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
General Public License for more details. You should have received a copy of the GNU Lesser
General Public License along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA </
xd:
detail>
</
xd:
doc>
<
xsl:
output indent="
yes"
encoding="
utf-8"
doctype-system="
teiP5/teilite.dtd" />
<
xsl:
strip-space elements="
*" />
<!---->
<
xsl:
template name="
div-atts">
<
xsl:
choose>
<
xsl:
when test="
@xml:id">
<
xsl:
attribute name="
xml:id">
<
xsl:
value-of select="
@xml:id" />
</
xsl:
attribute>
</
xsl:
when>
<
xsl:
otherwise>
<
xsl:
attribute name="
xml:id">
<
xsl:
value-of select="
@type" />
<
xsl:
if test="
@select">
<
xsl:
text>
-</
xsl:
text>
<
xsl:
value-of select="
@select" />
</
xsl:
if>
</
xsl:
attribute>
</
xsl:
otherwise>
</
xsl:
choose>
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Generate MULTEXT Category (PoS) table</
xd:
short>
</
xd:
doc>
<
xsl:
template match="
tei:divGen[@type='msd.cats']">
<
xsl:
variable name="
langs">
<
xsl:
call-template name="
cat-langs" />
</
xsl:
variable>
<
div>
<
xsl:
if test="
@xml:id">
<
xsl:
attribute name="
xml:id">
<
xsl:
value-of select="
@xml:id" />
</
xsl:
attribute>
</
xsl:
if>
<
xsl:
call-template name="
div-atts" />
<
head>
Table of categories</
head>
<
table rend="
frame">
<
row role="
label">
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A">
CATEGORY</
xsl:
with-param>
<
xsl:
with-param name="
B">
Value</
xsl:
with-param>
<
xsl:
with-param name="
C">
Code</
xsl:
with-param>
</
xsl:
call-template>
<
cell>
Attributes</
cell>
<
xsl:
call-template name="
allLangRow" />
</
row>
<
xsl:
for-each select="
ancestor::tei:div[.//tei:table[@n='msd.cat']][1]//tei:table[@n='msd.cat']">
<
row role="
data">
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A"
select="
tei:row[@role='type']/tei:cell[@role = 'name']" />
<
xsl:
with-param name="
B"
select="
tei:row[@role='type']/tei:cell[@role = 'value']" />
<
xsl:
with-param name="
C"
select="
tei:row[@role='type']/tei:cell[@role = 'code']" />
</
xsl:
call-template>
<
cell role="
attno">
<
xsl:
value-of select="
count(tei:row[@role='attribute'])" />
</
cell>
<
xsl:
call-template name="
LangRow">
<
xsl:
with-param name="
langs"
select="
tei:row[@role='type']/tei:cell[@role='lang']" />
</
xsl:
call-template>
</
row>
</
xsl:
for-each>
</
table>
</
div>
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Generate MULTEXT attribute table</
xd:
short>
</
xd:
doc>
<
xsl:
template match="
tei:divGen[@type='msd.atts']">
<
xsl:
variable name="
langs">
<
xsl:
call-template name="
cat-langs" />
</
xsl:
variable>
<
xsl:
variable name="
allvals">
<
xsl:
for-each select="
ancestor::tei:div[.//tei:table[@n='msd.cat']][1]//tei:table[@n='msd.cat']">
<
xsl:
for-each select="
tei:row[@role='attribute']">
<
row role="
data">
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A"
select="
tei:cell[@role='name']" />
<
xsl:
with-param name="
B"
select="
../tei:row[@role='type']/tei:cell[@role = 'value']" />
</
xsl:
call-template>
<
xsl:
apply-templates select="
tei:cell[@role='position']" />
<
xsl:
call-template name="
LangRow">
<
xsl:
with-param name="
langs"
select="
tei:cell/tei:table/tei:row/tei:cell[@role='lang']" />
</
xsl:
call-template>
</
row>
</
xsl:
for-each>
</
xsl:
for-each>
</
xsl:
variable>
<
div>
<
xsl:
call-template name="
div-atts" />
<
head>
Table of attributes</
head>
<
table rend="
frame">
<
row role="
label">
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A">
Attribute</
xsl:
with-param>
<
xsl:
with-param name="
B">
Category</
xsl:
with-param>
</
xsl:
call-template>
<
cell role="
code">
Position</
cell>
<
xsl:
call-template name="
allLangRow" />
</
row>
<
xsl:
apply-templates select="
exsl:node-set($allvals)/tei:row"
mode="
atts">
<
xsl:
sort select="
tei:cell[1]" />
<
xsl:
sort select="
tei:cell[2]" />
</
xsl:
apply-templates>
</
table>
</
div>
</
xsl:
template>
<
xsl:
template match="
tei:row"
mode="
atts">
<
xsl:
apply-templates select="
." />
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Generate MULTEXT value table</
xd:
short>
</
xd:
doc>
<
xsl:
template match="
tei:divGen[@type='msd.vals']">
<
xsl:
variable name="
langs">
<
xsl:
call-template name="
cat-langs" />
</
xsl:
variable>
<
xsl:
variable name="
allvals">
<
xsl:
for-each select="
ancestor::tei:div[.//tei:table[@n='msd.cat']][1]//tei:table[@n='msd.cat']">
<
xsl:
for-each select="
tei:row[@role='attribute']">
<
xsl:
variable name="
attposition"
select="
tei:cell[@role='position']" />
<
xsl:
variable name="
attname"
select="
tei:cell[@role='name']" />
<
xsl:
for-each select="
tei:cell/tei:table/tei:row[@role='value']">
<
row>
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A"
select="
tei:cell[@role='name']" />
<
xsl:
with-param name="
B"
select="
tei:cell[@role='code']" />
<
xsl:
with-param name="
C"
select="
ancestor::tei:row[@role='attribute']/tei:cell[@role='name']" />
<
xsl:
with-param name="
D"
select="
ancestor::tei:table/tei:row[@role='type']/tei:cell[@role='value']" />
</
xsl:
call-template>
<
xsl:
call-template name="
LangRow">
<
xsl:
with-param name="
langs"
select="
tei:cell[@role='lang']" />
</
xsl:
call-template>
</
row>
</
xsl:
for-each>
</
xsl:
for-each>
</
xsl:
for-each>
</
xsl:
variable>
<
div>
<
xsl:
call-template name="
div-atts" />
<
head>
Table of values</
head>
<
table rend="
frame">
<
row role="
label">
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A">
Value</
xsl:
with-param>
<
xsl:
with-param name="
B">
Code</
xsl:
with-param>
<
xsl:
with-param name="
C">
Attribute</
xsl:
with-param>
<
xsl:
with-param name="
D">
Category</
xsl:
with-param>
</
xsl:
call-template>
<
xsl:
call-template name="
allLangRow" />
</
row>
<
xsl:
apply-templates select="
exsl:node-set($allvals)/tei:row"
mode="
vals">
<
xsl:
sort select="
tei:cell[1]" />
<
xsl:
sort select="
tei:cell[3]" />
<
xsl:
sort select="
tei:cell[4]" />
</
xsl:
apply-templates>
</
table>
</
div>
</
xsl:
template>
<
xsl:
template match="
tei:row"
mode="
vals">
<
xsl:
apply-templates select="
." />
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Add number of MSDs to the main MSD index</
xd:
short>
</
xd:
doc>
<
xsl:
template match="
tei:table[@n='msd.lex']/tei:head">
<
head>
<
xsl:
apply-templates />
<
xsl:
text>
(</
xsl:
text>
<
xsl:
value-of select="
count(../tei:row[tei:cell[@role='msd']])" />
<
xsl:
text>
)</
xsl:
text>
</
head>
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Generate table with MSDs for a category</
xd:
short>
</
xd:
doc>
<
xsl:
template match="
tei:divGen[@type='msd.lex']">
<
xsl:
variable name="
cat"
select="
parent::tei:div//tei:table[@n='msd.cat']/tei:row[@role='type']/tei:cell[@role='value']" />
<
div type="
section">
<
xsl:
if test="
@xml:id">
<
xsl:
attribute name="
xml:id">
<
xsl:
value-of select="
@xml:id" />
</
xsl:
attribute>
</
xsl:
if>
<
head>
<
xsl:
text>
MSD Index</
xsl:
text>
</
head>
<
xsl:
apply-templates select="
ancestor::tei:div[@n='msd-language']//tei:table[@n='msd.lex']/../tei:p" />
<
table rend="
frame">
<
head>
<
xsl:
text>
MSDs</
xsl:
text>
<
xsl:
text>
(</
xsl:
text>
<
xsl:
value-of select="
count(ancestor::tei:div[@n='msd-language']//tei:table[@n='msd.lex']/tei:row[tei:cell[2] = $cat or substring-before(tei:cell[2],' ') = $cat])" />
<
xsl:
text>
)</
xsl:
text>
</
head>
<
xsl:
apply-templates select="
ancestor::tei:div[@n='msd-language']//tei:table[@n='msd.lex']/tei:row[1]" />
<
xsl:
for-each select="
ancestor::tei:div[@n='msd-language']//tei:table[@n='msd.lex']/tei:row">
<
xsl:
if test="
tei:cell[2] = $cat or substring-before(tei:cell[2],' ') = $cat">
<
xsl:
apply-templates select="
." />
</
xsl:
if>
</
xsl:
for-each>
</
table>
</
div>
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Process elements of MULTEXT attribute-value table for a Category (PoS)</
xd:
short>
</
xd:
doc>
<
xsl:
template match="
tei:table[@n='msd.cat']">
<
table rend="
frame">
<
xsl:
apply-templates select="
@*" />
<
xsl:
apply-templates select="
tei:head" />
<!---->
<
xsl:
variable name="
langs">
<
xsl:
call-template name="
cat-langs" />
</
xsl:
variable>
<
row role="
label">
<
cell role="
position">
P</
cell>
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A">
Attribute</
xsl:
with-param>
<
xsl:
with-param name="
B">
Value</
xsl:
with-param>
<
xsl:
with-param name="
C">
Code</
xsl:
with-param>
</
xsl:
call-template>
<
xsl:
call-template name="
allLangRow" />
</
row>
<
row role="
data">
<
cell role="
position">
<
xsl:
value-of select="
tei:row[@role='type']/tei:cell[@role = 'position']" />
</
cell>
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A"
select="
tei:row[@role='type']/tei:cell[@role = 'name']" />
<
xsl:
with-param name="
B"
select="
tei:row[@role='type']/tei:cell[@role = 'value']" />
<
xsl:
with-param name="
C"
select="
tei:row[@role='type']/tei:cell[@role = 'code']" />
</
xsl:
call-template>
<
xsl:
call-template name="
LangRow">
<
xsl:
with-param name="
langs"
select="
tei:row[@role='type']/tei:cell[@role='lang']" />
</
xsl:
call-template>
</
row>
<
xsl:
for-each select="
tei:row[@role='attribute']">
<
xsl:
for-each select="
tei:cell/tei:table/tei:row[@role='value']">
<
xsl:
element name="
{local-name()}">
<
xsl:
choose>
<
xsl:
when test="
position()=1">
<
xsl:
apply-templates select="
ancestor::tei:row[@role='attribute']/tei:cell[@role='position']" />
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
A"
select="
ancestor::tei:row[@role='attribute']/tei:cell[@role='name']" />
<
xsl:
with-param name="
B"
select="
tei:cell[@role='name']" />
<
xsl:
with-param name="
C"
select="
tei:cell[@role='code']" />
</
xsl:
call-template>
</
xsl:
when>
<
xsl:
otherwise>
<
cell />
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
$langs" />
<
xsl:
with-param name="
B"
select="
tei:cell[@role = 'name']" />
<
xsl:
with-param name="
C"
select="
tei:cell[@role = 'code']" />
</
xsl:
call-template>
</
xsl:
otherwise>
</
xsl:
choose>
<
xsl:
call-template name="
LangRow">
<
xsl:
with-param name="
langs"
select="
tei:cell[@role='lang']" />
</
xsl:
call-template>
</
xsl:
element>
</
xsl:
for-each>
</
xsl:
for-each>
</
table>
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Output row of all defined languages from table[@id='msd.langs']</
xd:
short>
</
xd:
doc>
<
xsl:
template name="
allLangRow">
<
xsl:
if test="
ancestor::tei:div[@xml:id='msd.common']">
<!---->
<
xsl:
for-each select="
//tei:table[@xml:id='msd.langs']/tei:row[@role='lang']">
<
xsl:
apply-templates select="
tei:cell[@role='name']" />
</
xsl:
for-each>
</
xsl:
if>
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Output row of defined languages from table[@id='msd.langs'] if they are defined in
$langs</
xd:
short>
</
xd:
doc>
<
xsl:
template name="
LangRow">
<
xsl:
param name="
langs"
select="
tei:cell[@role='lang']" />
<!---->
<
xsl:
if test="
ancestor::tei:div[@xml:id='msd.common']">
<
xsl:
for-each select="
//tei:table[@xml:id='msd.langs']/tei:row[@role='lang']/tei:cell[@role='code']">
<
cell role="
lang">
<!---->
<
xsl:
variable name="
langcodes">
<
xsl:
apply-templates select="
exsl:node-set($langs)"
mode="
langs">
<
xsl:
with-param name="
lang"
select="
." />
</
xsl:
apply-templates>
</
xsl:
variable>
<
xsl:
value-of select="
substring-before($langcodes,' ')" />
</
cell>
</
xsl:
for-each>
</
xsl:
if>
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
Output label lang only if it matches with selected language</
xd:
short>
</
xd:
doc>
<
xsl:
template match="
*"
mode="
langs">
<
xsl:
param name="
lang" />
<
xsl:
choose>
<
xsl:
when test="
. = $lang">
<
xsl:
value-of select="
." />
<
xsl:
text>
</
xsl:
text>
</
xsl:
when>
</
xsl:
choose>
</
xsl:
template>
<
xsl:
template name="
ABCD">
<
xsl:
param name="
langs" />
<
xsl:
param name="
A" />
<
xsl:
param name="
B" />
<
xsl:
param name="
C" />
<
xsl:
param name="
D" />
<
xsl:
variable name="
lang"
select="
substring-before($langs,' ')" />
<
xsl:
if test="
normalize-space($lang)">
<
cell>
<
xsl:
call-template name="
lang-cell">
<
xsl:
with-param name="
lang"
select="
$lang" />
<
xsl:
with-param name="
X"
select="
$A" />
</
xsl:
call-template>
</
cell>
<
xsl:
if test="
normalize-space($B)">
<
cell>
<
xsl:
call-template name="
lang-cell">
<
xsl:
with-param name="
lang"
select="
$lang" />
<
xsl:
with-param name="
X"
select="
$B" />
</
xsl:
call-template>
</
cell>
</
xsl:
if>
<
xsl:
if test="
normalize-space($C)">
<
cell>
<
xsl:
call-template name="
lang-cell">
<
xsl:
with-param name="
lang"
select="
$lang" />
<
xsl:
with-param name="
X"
select="
$C" />
</
xsl:
call-template>
</
cell>
</
xsl:
if>
<
xsl:
if test="
normalize-space($D)">
<
cell>
<
xsl:
call-template name="
lang-cell">
<
xsl:
with-param name="
lang"
select="
$lang" />
<
xsl:
with-param name="
X"
select="
$D" />
</
xsl:
call-template>
</
cell>
</
xsl:
if>
<
xsl:
call-template name="
ABCD">
<
xsl:
with-param name="
langs"
select="
substring-after($langs,' ')" />
<
xsl:
with-param name="
A"
select="
$A" />
<
xsl:
with-param name="
B"
select="
$B" />
<
xsl:
with-param name="
C"
select="
$C" />
<
xsl:
with-param name="
D"
select="
$D" />
</
xsl:
call-template>
</
xsl:
if>
</
xsl:
template>
<
xsl:
template name="
lang-cell">
<
xsl:
param name="
lang" />
<
xsl:
param name="
X" />
<!---->
<
xsl:
choose>
<
xsl:
when test="
exsl:node-set($X)[@xml:lang=$lang]">
<
xsl:
choose>
<
xsl:
when test="
$lang = '?'">
<
xsl:
value-of select="
exsl:node-set($X)" />
</
xsl:
when>
<
xsl:
otherwise>
<
xsl:
value-of select="
exsl:node-set($X)[@xml:lang=$lang]" />
</
xsl:
otherwise>
</
xsl:
choose>
</
xsl:
when>
<!---->
<
xsl:
when test="
exsl:node-set($X)[@xml:lang]">
<
xsl:
text>
(</
xsl:
text>
<
xsl:
value-of select="
exsl:node-set($X)//@xml:lang" />
<
xsl:
text>
)</
xsl:
text>
</
xsl:
when>
<
xsl:
when test="
$X">
<
xsl:
value-of select="
$X" />
<
xsl:
if test="
$lang != '?'">
<
xsl:
text>
(</
xsl:
text>
<
xsl:
value-of select="
$lang" />
<
xsl:
text>
)</
xsl:
text>
</
xsl:
if>
</
xsl:
when>
<
xsl:
otherwise>
<
xsl:
text />
</
xsl:
otherwise>
</
xsl:
choose>
</
xsl:
template>
<!---->
<
xsl:
template name="
cat-langs">
<
xsl:
choose>
<
xsl:
when test="
ancestor::tei:div[@xml:id='msd.common']">
<
xsl:
text>
? </
xsl:
text>
<!---->
</
xsl:
when>
<
xsl:
when test="
self::tei:table">
<
xsl:
for-each select="
tei:row[1]/tei:cell[@role='value']/@xml:lang">
<
xsl:
value-of select="
." />
<
xsl:
text>
</
xsl:
text>
</
xsl:
for-each>
</
xsl:
when>
<
xsl:
otherwise>
<
xsl:
for-each select="
ancestor::tei:div[@n='msd-language']/tei:div[tei:table[@n='msd.cat']][1]/ tei:table[@n='msd.cat'][1]/tei:row[1]/tei:cell[@role='value']/@xml:lang">
<
xsl:
value-of select="
." />
<
xsl:
text>
</
xsl:
text>
</
xsl:
for-each>
</
xsl:
otherwise>
</
xsl:
choose>
</
xsl:
template>
<
xd:
doc>
<
xd:
short>
By default pass through</
xd:
short>
</
xd:
doc>
<
xsl:
template match="
tei:table">
<
xsl:
element name="
{local-name()}">
<
xsl:
apply-templates select="
@*" />
<
xsl:
attribute name="
rend">
frame</
xsl:
attribute>
<
xsl:
apply-templates />
</
xsl:
element>
</
xsl:
template>
<
xsl:
template match="
@rows" />
<
xsl:
template match="
@cols" />
<
xsl:
template match="
tei:*">
<
xsl:
element name="
{local-name()}">
<
xsl:
apply-templates select="
@*" />
<
xsl:
apply-templates />
</
xsl:
element>
</
xsl:
template>
<
xsl:
template match="
*">
<
xsl:
copy>
<
xsl:
apply-templates select="
@*" />
<
xsl:
apply-templates />
</
xsl:
copy>
</
xsl:
template>
<
xsl:
template match="
@*">
<
xsl:
copy />
</
xsl:
template>
</
xsl:
stylesheet>
v