XSLT 2.0 координирует несколько режимов

XSLT 2.0, таблица стилей и данные по адресу https://xsltfiddle.liberty-development.net/bFDb2D3/4

Я преобразовываю средневековые документы, закодированные в tei-xml, в веб-страницы, где пользователь может переключаться между двумя разными представлениями документов, а также видеть перевод и различные сноски (например). Для вывода требуется несколько уровней обработки:

  • Две латинские версии («inter» и «diplo»), между которыми может переключаться пользователь (получены из одной и той же разметки tei)
  • Переведенная версия почти без преобразований (только форматирование абзаца и курсив)
  • Критический аппарат с использованием сносок # а, б, в и т. д.
  • Исторические сноски с использованием сноски № 1, 2, 3 и т. д.

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

Что должно выводить:

  1. <div class="inter"><p> со всеми режимами преобразований inter + fn-add-marker [это должно содержать <a href>, надстрочные буквы и цифры в тексте]

  2. <div class="diplo"><p> со всеми режимами преобразований diplo + fn-add-marker [это должно содержать [текст] , номера строк, надстрочные буквы и цифры в тексте]

  3. <div><p> с переводами

  4. <div> с критическим оборудованием

  5. <div> со сносками

Вывод XSLTfiddle:

  1. URL и надстрочные буквы в порядке! отсутствуют надстрочные числа (режим fn-add-marker)
  2. Надстрочные буквы в порядке! Строка # и [текст] в порядке, за исключением тех мест, где находятся строки <persName> или <placeName> (т. е. <xsl:template match="tei:lb"> <xsl:template match="tei:supplied">) и отсутствуют цифры надстрочного индекса (режим fn-add-marker)
  3. ok!
  4. ok!
  5. ok!

Что касается № 2, отсутствующая строка # и [текст] кажутся результатом того, что шаблоны, которые обрабатывают <persName> и <placeName>, не передают другим шаблонам? (шаблоны в строках 173-218)

Все шаблоны, касающиеся режима fn-add-marker, находятся в строках 41-77.

Спасибо заранее.


person jbrehr    schedule 22.10.2018    source источник


Ответы (1)


В основном в XSLT 2, когда вы работаете с именованными режимами, вам нужно убедиться, что шаблон принадлежит определенному режиму, например, mode="foo", который вы используете, например. mode="foo" или более общий mode="#current" на любом xsl:apply-templates внутри, чтобы обеспечить продолжение обработки в этом режиме. См. https://www.w3.org/TR/xslt20/#element-apply-templates для получения подробной информации.

В https://xsltfiddle.liberty-development.net/gWmuiK7 я попытался XSLT исправить свою таблицу стилей, а затем на https://xsltfiddle.liberty-development.net/bFDb2D3/5 вы можете увидеть результат применения фиксированной таблицы стилей. Не уверен, что этот программный подход является правильным инструментом, но он может помочь продемонстрировать предлагаемый режим использования mode на xsl:apply-templates.

Затем, я думаю, вам нужно убедиться, что вы обрабатываете добавленные маркеры в двух новых режимах:

<!-- adds fn numbers -->
<xsl:template match="tei:date[@type='deposition_date']" mode="inter dilpo">
    <xsl:apply-templates mode="#current"/>
    <xsl:apply-templates select="." mode="number"/>
</xsl:template>

<xsl:template match="tei:note[@type='public'] | tei:fn-marker" mode="inter diplo">
    <xsl:apply-templates select="." mode="number"/>
</xsl:template>

<xsl:template match="tei:date[@type='deposition_date'] |  tei:note[@type='public'] | tei:fn-marker" mode="number">
    <sup>
       <xsl:number count="tei:date[@type='deposition_date'] |  tei:note[@type='public'] | tei:fn-marker" format="1" level="any"/>
    </sup>
</xsl:template>
<!-- end of footnote transformations -->

https://xsltfiddle.liberty-development.net/bFDb2D3/6 строки с 51 по 66.

person Martin Honnen    schedule 22.10.2018
comment
Верно, спасибо. Итак, чего я не вижу, так это того, как заставить режим fn-add-marker затем выводиться - в какой момент он становится «текущим». Как будто процессор его не видит, и я не смог найти точку входа, чтобы вызвать его ... так как ему нужно выполнить преобразование дважды (для выходов «inter» и «diplo»). - person jbrehr; 22.10.2018
comment
См. редактирование ответа, если я не заблудился, вам не нужно менять этот режим fn-add-marker, вместо этого вам нужно убедиться, что код для преобразования маркеров и заметок в числа теперь применяется в двух режимах inter и diplo, которые вы представил. - person Martin Honnen; 22.10.2018
comment
Ах, я перевернул логику (и нет, вы не заблудились). Я также не знал, что в mode можно поместить два режима. Это фантастика, и я снова многому научился. Спасибо. - person jbrehr; 22.10.2018