XSL: добавьте ссылку на подстроку в строке, состоящей из нескольких элементов TEI-XML.

Несколько дней пытаюсь добавить ссылку на подстроку w[@type='verb'] в строку. Я работаю над TEI-XML транслитерацией глиняных табличек, поэтому elements и @type из <w>, содержащихся в <l>, не всегда находятся в одном и том же порядке.

XSLT версия 3.0:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:template match="/">
 <xsl:apply-templates select="//div1"/>
</xsl:template>

<xsl:template match="//div1">
<!-- additional content before <ul> -->
 <ul>
  <li>
    <xsl:for-each select="descendant-or-self::lg/l[@n]">
       <xsl:variable name="verb1" select="w[@type='verb']"/>
       <xsl:variable name="href1" select="w[@type='verb']/@lemmaRef"/>
       <xsl:variable name="single-l" select="w[@type='coo'] | w[@type='noun'] | w[@type='verb'] | w[@type='num'] | w[@type='adv'] | w[@type='adj'] | g | name"/>

       <xsl:value-of select="$single-l"/> 
       <sup><xsl:value-of select="./@n"/></sup>
     </xsl:for-each>
   </li>
 </ul>
</xsl:template>

Мне нужно добавить ссылку lemmaRef для каждого w[@type='verb'].

Образец TEI — я удалил @xml:id из element кроме l для этого примера:

<lg>
    <l n="4b-5a" xml:id="ktu1-3_ii_l4b-5a">
       <w type="coo">w</w><space/>
       <w type="verb" lemmaRef="uga/verb.xsl#qry"><damage degree="medium" facs="definir"><supplied resp="KTU">t</supplied></damage>qry</w>
       <g>.</g>
       <w type="noun" lemmaRef="uga/noun.xsl#ġlm">ġlmm</w>
       <lb/><w>b</w><space/>
       <w type="noun" lemmaRef="uga/noun.xsl#št">št</w>
       <g>.</g>
       <w type="noun" lemmaRef="uga/noun.xsl#ġr">ġr</w>
       <g>.</g>
    </l>
 </lg>

Мне нужно отобразить:

<ul>
 <li>w <a href="uga/verb.xml#qry">tqry</a> . ġlmm št . ġr .<sup>4b-5a</sup></li>
</ul>

«tqry» — это глагол, содержащийся в <l>.

Как я могу сделать в XSLT, чтобы иметь возможность отображать <a href="{$href1}"><xsl:value-of select="$verb1"/>. Я пробовал replace из $single-l или определить новую переменную из предыдущего кода XSLT, но это не работает. Я пробовал также с key, но я думаю, что у меня все еще есть проблемы с пониманием...

Заранее благодарим вас за ваш добрый совет.


person Vanessa    schedule 07.01.2018    source источник


Ответы (1)


Я не думаю, что вам следует пытаться создать строку, а затем вставить туда разметку, кажется, должна быть возможность просто обработать дочерние элементы, а затем сопоставить lg/l[@n]/w[@type = 'verb'], чтобы преобразовать ее в гиперссылку HTML:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

  <xsl:output method="html" indent="yes" html-version="5"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>Example</title>
      </head>
      <xsl:apply-templates/>
    </html>
  </xsl:template>

  <xsl:template match="div">
      <section>
          <ul>
              <xsl:apply-templates select=".//lg/l[@n]"/>
          </ul>
      </section>
  </xsl:template>

  <xsl:template match="lg/l[@n]">
      <li>
          <xsl:apply-templates/>
          <sup>
              <xsl:value-of select="@n"/>
          </sup>
      </li>
  </xsl:template>

  <xsl:template match="lg/l[@n]/w[@type = 'verb']">
      <a href="{@lemmaRef}">
          <xsl:apply-templates/>
      </a>
  </xsl:template>

  <xsl:template match="space">
      <xsl:text> </xsl:text>
  </xsl:template>

</xsl:stylesheet>

В настоящее время это не совсем дает желаемый результат, но

<li>w <a href="uga/verb.xsl#qry">tqry</a>.ġlmmb št.ġr.<sup>4b-5a</sup></li>

вместо этого, но если есть контент из элемента, который вам не нужен или не нужен, вы можете добавить для него пустой шаблон, чтобы он не производил никакого вывода (например, <xsl:template match="lg/l[@n]/w[not(@type)]"/>).

Я не уверен, отсутствуют ли также важные пробелы и каковы правила их вставки, возможно, вам придется это объяснить.

Онлайн-образец находится по адресу http://xsltfiddle.liberty-development.net/b4GWV5/1.

person Martin Honnen    schedule 07.01.2018
comment
замечательно! Я часами искал решение, когда оно выглядит так просто...!! Я не знал section. Отсутствие пробела на самом деле не проблема, так как есть <g>. Но, может быть, с регулярным выражением я могу добавить пробел. Я посмотрю и напишу, если найду правильный ответ. - person Vanessa; 07.01.2018