跳转到内容

XQuery/TEI 对照

来自维基教科书,开放的书籍,为开放的世界

您想要从已经以 TEI 格式存在的平行文本中构建一个多语言对照(参见 http://www.tei-c.org/

此示例中有三个步骤

  1. 对文本进行预处理以简化索引,这在 XSLT 2.0 中完成
  2. 查询文本以返回 tei:entry(参见 http://www.tei-c.org/release/doc/tei-p5-doc/en/html/DI.html),这在 XQuery 中完成
  3. 将 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) &gt; 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>
}


转换为 HTML

[编辑 | 编辑源代码]

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, '&amp;kupu=', tei:form/tei:orth/text(), '&amp;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, '&amp;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>
华夏公益教科书