XSLT 2.0 обрезает длину текста окончательного вывода HTML - PullRequest
0 голосов
/ 17 ноября 2018

XSLT Fiddle здесь: https://xsltfiddle.liberty -development.net / bFDb2Dh / 2

В XSL 2.0 я получаю небольшой набор узлов из функции поиска eXist-db Lucene, которая возвращает исходный XML, но оборачивает поисковый термин в <exist:match/>. Поэтому я выполняю поиск по tei:seg и получаю следующее (которое я обертываю при выводе в дополнительный элемент для последующей обработки):

<doc>
  <url>http://localhost:8081/exist/apps/deheresi/doc/MS609-0454</url>
  <seg xmlns="http://www.tei-c.org/ns/1.0" type="dep_event" subtype="event" xml:id="MS609-0454-2" corresp="#MS609-0453-7">Item. Dixit<lb break="y" n="11"/>quod 
    <persName nymRef="#abbot_of_Saint_Papoul" role="npar">abbas de 
        <placeName nymRef="#Saint-Papoul_Aude">Sancto Papulo</placeName>
    </persName> ceperat 
    <persName nymRef="#heretics_not_named" role="par">duos hereticos</persName> et 
    <persName nymRef="#Arnald_Savauza_SML-AU" ana="#pFreeHer" role="par">Arnaldus de Savauza</persName> volebat manulevare dictos hereticos. Et rogavit 
    ipsum<lb break="y" n="12"/>testim et 
    <persName nymRef="#Arnald_Forner_SML-AU" ana="#pFreeHer" role="par">Arnaldum Fornier</persName> et 
    <persName nymRef="#Raimund_Forner_SML-AU" ana="#pFreeHer" role="par">Raimundum Fornier</persName>, fratres,  
    quod irent cum eo 
    ad abbatem de <placeName type="event_loc" nymRef="#Saint-Papoul_Abbey">Sancto<lb break="y" n="14"/>Papulo</placeName> 
    et manulevarent hereticos. Et dictus 
    <persName nymRef="#Arnald_Savauza_SML-AU" ana="#pFreeHer" role="ref">Arnaldus de Savauza</persName> 
    dixit quod dictus abbas promiserat ei quod redderet sibi dictos<lb break="y" n="15"/>
    hereticos pro mille <exist:match xmlns:exist="http://exist.sourceforge.net/NS/exist">solidis</exist:match> tholosanis. Et 
    <persName nymRef="#Bernard_Alzeu_SML-AU" ana="#pFreeHer" role="ref">Bernardus Alzeus</persName> et 
    <persName nymRef="#Ysarn_de_Gibel_SML-AU" ana="#pFreeHer" role="ref">Ysarnus de Gibel</persName> portabant illos denarios. 
    Sed non potuerunt dictos hereticos ma<lb break="n" n="16"/>nulevare. 
    <date type="event_date" when="1237">Et sunt anni VIIIor vel circa.</date>
  </seg>
</doc>

В XSLT я выводил это в HTML с некоторыми преобразованиями. Однако вывод выглядит так:

<td>Item. Dixit quod 
   abbas de 
   Sancto Papulo
   ceperat 
   duos hereticos et 
   Arnaldus de Savauza volebat manulevare dictos hereticos. Et rogavit 
   ipsum testim et 
   Arnaldum Fornier et 
   Raimundum Fornier, fratres,  
   quod irent cum eo 
   ad abbatem de Sancto Papulo 
   et manulevarent hereticos. Et dictus 
   Arnaldus de Savauza 
   dixit quod dictus abbas promiserat ei quod redderet sibi dictos 
   hereticos pro mille <span class="search-hit">
   <a href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0454"> 
   solidis</a></span> tholosanis. Et 
   Bernardus Alzeus et 
   Ysarnus de Gibel portabant illos denarios. 
   Sed non potuerunt dictos hereticos manulevare. 
   Et sunt anni VIIIor vel circa.
</td>

Но я бы хотел, чтобы конечный результат был сокращен с помощью многоточия:

<td>...dictus abbas 
  promiserat ei quod redderet sibi dictos 
  hereticos pro mille <span class="search-hit"><a 
  href="http://localhost:8081/exist/apps/deheresi/doc/MS609-0454"> 
  solidis</a></span> tholosanis. Et 
  Bernardus Alzeus et 
  Ysarnus de Gibel portabant illos...
</td>

Где вывод текста по обе стороны от содержимого <span class="search-hit"/> ограничен x количеством символов. (Далее, если возможно, примените normalize-space() для устранения проблем с пробелами в исходном документе.)

Я не нашел идей, как подойти к этому в рамках текущего преобразования XSL, только в постобработке.

Заранее большое спасибо.

1 Ответ

0 голосов
/ 17 ноября 2018

Вы можете сохранить содержимое tei:seg соответственно td результата, полученного из существующего кода, в переменной в

<xsl:template match="tei:seg">
    <xsl:variable name="search-hit">
        <xsl:apply-templates/>
    </xsl:variable>
    <td>
        <xsl:apply-templates select="$search-hit" mode="trim"/>
    </td>
</xsl:template>

и затем вы можете протолкнуть этот контент через другой режим, в котором есть шаблоны для текстовых узлов для выполнения обрезки:

<xsl:param name="trim-to" as="xs:integer" select="60"/>

<xsl:template match="text()[1]" mode="trim">
    <xsl:variable name="normalized" as="xs:string" select="normalize-space(.)"/>
    <xsl:value-of select="concat('...', substring($normalized, string-length($normalized) - $trim-to))"/>
</xsl:template>

<xsl:template match="text()[last()]" mode="trim">
    <xsl:variable name="normalized" as="xs:string" select="normalize-space(.)"/>
    <xsl:value-of select="concat(substring($normalized, 1, $trim-to), '...')"/>
</xsl:template>

<xsl:template match="span[@class = 'search-hit']" mode="trim">
    <xsl:copy-of select="."/>
</xsl:template>

Код, выполняющий обрезку / нормализацию, может быть тонко настроен с использованием replace и / или tokenize и / или xsl:analyze-string в шаблонах текстовых узлов, но это возможно только в том случае, если алгоритм, необходимый для обрезки, ясен ,

Fiddle настроен на https://xsltfiddle.liberty -development.net / bFDb2Dh / 3 .

...