XQuery/TEI 对照
外观
< XQuery
您想要从已经以 TEI 格式存在的平行文本中构建一个多语言对照(参见 http://www.tei-c.org/)
此示例中有三个步骤
- 对文本进行预处理以简化索引,这在 XSLT 2.0 中完成
- 查询文本以返回 tei:entry(参见 http://www.tei-c.org/release/doc/tei-p5-doc/en/html/DI.html),这在 XQuery 中完成
- 将 tei:entry 处理为 HTML,这在浏览器中的 XSLT 1.0 中完成
在这个特定的示例中,使用的语言是英语和毛利语。它假设结构化标签具有“n”属性,这些属性包含指向数据原始来源的 URL。
此样式表将文本分成单词(tei:w 参见 http://www.tei-c.org/release/doc/tei-p5-doc/en/html/ref-w.html)并在每个单词上记录“词条”或单词的规范形式以及它所在的语言。这些被重新计算以允许构建它们的索引。
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns="http://www.tei-c.org/ns/1.0"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<!-- This is a simple stylesheet that inserts word tags around words
(and implicitly defines what those words are) -->
<xsl:variable name="lowernormal" select="'qwertyuiopasdfghjklzxcvbnmaeiouaeiou'"/>
<xsl:variable name="upper" select="'QWERTYUIOPASDFGHJKLZXCVBNMĀĒĪŌŪāēīōū'"/>
<xsl:variable name="drop" select="'{}()*'"/>
<xsl:variable name="punctuation" select="'.:;,!?'"/>
<xsl:variable name="regexp" select="('.:;,!?')*()"/>
<xsl:template match="@*|node()" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[normalize-space()]">
<xsl:variable name='orig' select="."/>
<xsl:variable name='lang' select="$orig/ancestor::*[normalize-space(@xml:lang)][1]/@xml:lang"/>
<xsl:analyze-string select="." regex="[\p{{L}}\p{{N}}]+">
<xsl:matching-substring>
<xsl:variable name="normalised">
<xsl:call-template name="normal">
<xsl:with-param name="string" select="translate(.,$upper,$lowernormal)"/>
</xsl:call-template>
</xsl:variable>
<xsl:element name="w" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="xml:lang"><xsl:value-of select="$lang"/></xsl:attribute>
<xsl:attribute name="lemma"><xsl:value-of select="$normalised"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
<xsl:template name="normal">
<xsl:param name="string"/>
<xsl:if test="string-length($string) > 0">
<xsl:if test="not(compare(substring($string,1,1),substring($string,2,1))=0)">
<xsl:value-of select="substring($string,1,1)"/>
</xsl:if>
<xsl:call-template name="normal">
<xsl:with-param name="string" select="substring($string,2)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
查询构建一个包含多个 <tei:cit> 的单个 <tei:entry> 标签,每个匹配项对应一个。处理指令用于将 TEI 与样式表相关联。
xquery version "1.0";
declare default element namespace "http://www.tei-c.org/ns/1.0";
declare option exist:serialize "method=xml media-type=application/xml process-xsl-pi=yes indent=yes";
let $target := 'xml-stylesheet',
$content := 'href="teiresults2htmlresults.xsl" type="text/xsl" '
return processing-instruction {$target} {$content},
document {
<TEI>
<teiHeader>
<!-- substantial header information needs to go here to be well formed TEI -->
</teiHeader>
<text>
<body>
<div> {
let $collection := '/db/kupu/korero',
$q := request:get-parameter('kupu', 'mohio'),
$lang := request:get-parameter('reo', 'mi'),
$first := request:get-parameter('kotahi', 1) cast as xs:decimal,
$last := 25 + $first
return
<entry xml:lang="{$lang}" n="{$last}">
<form>
<orth>{$q}</orth>
</form>{
for $word at $count in subsequence(collection($collection)//w[@lemma=$q][@xml:lang=$lang], $first, $last)
let $this := $word/ancestor::*[@n][1]
let $thisid := $this/@xml:id
let $url := $this/@n
let $lang := $word/@xml:lang
let $that :=
if ( $this/@corresp )
then (
$this/../../*/*[concat('#',@xml:id)=$this/@corresp]
) else (
"no corresp"
)
return
<cit n="{$url}" corresp="#{$word/@xml:id}">
{$this}
{$that}
</cit>
}</entry>
}
</div>
</body>
</text>
</TEI>
}
TEI 在浏览器中按照处理指令转换为 HTML
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:variable name="title"><xsl:value-of select="//tei:orth/text()"/></xsl:variable>
<xsl:variable name="lang"><xsl:value-of select="//tei:entry/@xml:lang"/></xsl:variable>
<xsl:template match="@*|node()" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<html:html xml:lang="{$lang}" >
<html:head>
<html:title><xsl:value-of select="$title"/></html:title>
<html:meta property="dc:title" xml:lang="{$lang}" content="{$title}"/>
</html:head>
<html:body xml:lang="{$lang}" >
<xsl:apply-templates select="/tei:TEI/tei:text/tei:body/tei:div/tei:entry"/>
</html:body>
</html:html>
</xsl:template>
<xsl:template match="@xml:id" />
<xsl:template match="tei:entry">
<html:h2 xml:lang="mi">He Kupu Tawhito</html:h2>
<html:h1 xml:lang="mi">Kupu matua: <html:span class="hit-word" style="font-style: italic" xml:lang="{$lang}"><xsl:value-of select="$title"/></html:span></html:h1>
<html:div>
<xsl:apply-templates select="tei:cit"/>
</html:div>
<xsl:variable name="url"><xsl:value-of select="concat('kupu.xql?reo=', @xml:lang, '&kupu=', tei:form/tei:orth/text(), '&kotahi=', @n)"/></xsl:variable>
<html:div> <html:p> <html:a href="{$url}" style="font-style: italic">Panuku</html:a> </html:p> </html:div>
</xsl:template>
<xsl:template match="tei:cit" >
<html:div>
<xsl:apply-templates select="node()"/>
</html:div>
<html:hr/>
</xsl:template>
<xsl:template match="tei:p">
<html:div>
<xsl:apply-templates select="node()"/>
<html:a href="{@n}" alt="ko te tohutoro" style="font-style: italic">↗</html:a>
</html:div>
</xsl:template>
<xsl:template match="tei:w">
<xsl:variable name="url"><xsl:value-of select="concat('kupu.xql?reo=', @xml:lang, '&kupu=', @lemma)"/></xsl:variable>
<xsl:choose>
<xsl:when test="concat('#',@xml:id)=../../@corresp">
<html:span class="hit-word" style="font-style: italic"><html:a href="{$url}" alt="">
<xsl:apply-templates select="node()"/>
</html:a></html:span>
</xsl:when>
<xsl:otherwise>
<html:a href="{$url}">
<xsl:apply-templates select="node()"/>
</html:a>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>