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

Этот вопрос основан на ответах на мой оригинальный вопрос , где было предложено опубликовать продолжение.Это касается попыток интеграции кода XSL из предыдущего поста.

В предыдущем вопросе я представил упрощенную версию документа TEI: XML, который я преобразовываю в HTML с использованием XSLT 2.0 (полный файл tei и текущий xslt можно найти здесь https://xsltfiddle.liberty -development.сеть / bdxtqT / 6 ).Это более полное представление об иерархии, но не все детали:

<tei>
 <teiHeader/>
 <text>
   <front/>
   <body>
     <p xml:lang="LA">
       <seg type="typefoo" corresp="#foo601" xml:id="foo361">
         <date type="deposition_date" when="1245">Idus 
         marcii</date>In non hendrerit metus. Sed in posuere 
         eros, sit amet pharetra lacus.</seg>
       <seg type="typefoo" xml:id="foo362">Nullam semper varius 
         justo, vitae mollis turpis dapibus sit amet. 
         Donec<note type="public_note">note content</note> 
         rhoncus tempor urna sit amet imperdiet.</seg>
       <seg type="typefoo" xml:id="foo363">Integer 
         id ante nunc. Curabitur at ligula sed arcu consequat 
         gravida et id orci. Morbi quis porta dolor.</seg>
       <seg type="typefoo" corresp="#fooid2">Sed dictum<note 
         type="public_note">note content 2</note> sem nec urna sodales 
         cursus. Donec sit amet nibh tempor, congue ligula semper, 
         rhoncus odio.</seg>
     </p>
   </body>
   <back>
     <p xml:lang="EN">
       <seg>
       <seg>
     </p>
     <p xml:lang="FR">
       <seg>
       <seg>
     </p>
   </back>
 </text>     
<tei>

Требуемый вывод HTML выглядит следующим образом.Добавочные номера сносок создаются в <sup> на основе одного из трех условий:

  • date[@type="deposition_date"] (добавить номер сноски),

  • seg[@type="typefoo"] (добавить номер сноски)

  • note[@type="public_note"] (заменить на номер сноски).

Желаемый вывод

 <div>
   <p>Idus marcii<sup>1</sup>In non hendrerit metus. Sed in 
       posuere eros, sit amet pharetra lacus.</p><sup>2</sup>
   <p>Nullam semper varius justo, vitae mollis turpis 
       dapibus sit amet. Donec<sup>3</sup> rhoncus tempor 
       urna sit amet imperdiet.</p>
   <p>Integer id ante nunc. Curabitur at ligula sed 
       arcu consequat gravida et id orci. Morbi quis porta 
       dolor.</p>
   <p>Sed dictum sem<sup>4</sup> nec urna sodales cursus. 
      Donec sit amet nibh tempor, congue ligula semper, 
      rhoncus odio.</p><sup>5</sup>
  <div>

  [...]

 <div>
   <p><sup>1</sup> 1245</p>
   <p><sup>2</sup> foo601</p>
   <p><sup>3</sup> note here</p>
   <p><sup>4</sup> note here</p>
   <p><sup>5</sup> fooid2</p>
  </div>

Полный документ XSLT-преобразования находится по адресу https://xsltfiddle.liberty -development.net / bdxtqT / 6 , где можно увидеть следующие проблемы:

  • date[@type='deposition_date'] полностью заменяется, вместо этого он получает добавленный маркер сноски
  • seg[@type='dep_event' and @corresp] не получает добавленный маркер сноски, но он появляется в <div> внизу страницы.

XSL-файл слишком длинный и, кажется, вставляется неправильно.Взаимодействовать с файлами здесь https://xsltfiddle.liberty -development.net / bdxtqT / 6 .

Примечание: я ограничен XSLT 2.0, поскольку это преобразование запускается внутри eXist-DB с помощью Xquery 3.1.

Большое спасибо!

1 Ответ

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

Я думаю, что если вы не хотите поставить префикс всех ваших путей в этом шаблоне, совпадающих с /, с переменной, которую я предложил сохранить результат вставки маркера, один из способов объединить существующий код с моим предложением - это изменить соответствиеот / до /*, например, используйте

<xsl:template match="/*">
        <!-- div for text -->
        <div>
            <!-- LATIN : always present -->
            <h3>Latin</h3>
            <xsl:apply-templates select="//tei:body//tei:p"/>

            <!-- ENGLISH : always present -->
            <h3>English</h3>
            <xsl:apply-templates select="//tei:back//tei:p[@xml:lang='EN']"/>

            <!-- FRENCH : sometimes present -->
            <xsl:if test="//tei:back//tei:p[@xml:lang='FR']">
                <h3>French</h3>
                <xsl:apply-templates select="//tei:back//tei:p[@xml:lang='FR']"/>
            </xsl:if>
            <!-- FOOTER for notes -->
            <div class="footer">

            <!-- FOOTNOTES (uses mode="build_footnotes" to construct a block of footnotes in <div>) -->
               <xsl:if test="$footnote-sources">
                 <div class="footnotes" id="footnotesdiv">
                     <xsl:apply-templates select="$footnote-sources" mode="build_footnotes"/>
                 </div>
               </xsl:if>
            </div>
        </div>
</xsl:template>

, что будет означать, что мое предложение использовать

<xsl:template match="/">
    <xsl:apply-templates select="$fn-markers-added/node()"/>
</xsl:template>

может быть сохранено, и процессор XSLT его применяет.

Однако эта переменная $footnote-sources используется в конце шаблона, насколько я вижу из фрагмента, ее использование на узлах из исходного входного документа не будет затронуто введениемвременный результат с добавлением маркеров, но как-то мне было бы неправильно в этом месте продолжать обрабатывать исходный ввод, в то время как остальные работают с временным результатом, поэтому я был бы склонен изменить объявление переменной на

<xsl:variable name="footnote-sources" select="$fn-markers-added/tei:text//tei:seg//date[@type='deposition_date'] | 
    $fn-markers-added/tei:text//tei:seg//note[@type='public_note'] | $fn-markers-added/tei:text//tei:seg[@corresp]"/>

С этими двумя изменениями я думаю, что мое предложение в предыдущем ответе должно быть применено.Хотя теперь, снова обращаясь к опубликованному источнику с корневым элементом tei, мне интересно, как глобальная переменная с путями, начинающимися с tei:text, выбрала бы что угодно, но, возможно, это упущение в примере.

...