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

У меня есть tei:xml документы, которые я преобразовываю в HTML с помощью XSLT 2.0.Эффективная структура документов tei выглядит следующим образом:

...
<p xml:lang="LA">
  <seg type="a" corresp="#fooid"><date type="doc_date" when="1245"/>In non hendrerit metus. Sed in 
       posuere eros, sit amet pharetra lacus.</seg>
  <seg type="a">Nullam semper varius justo, vitae mollis turpis 
       dapibus sit amet. Donec<note type="public_note"></note> 
       rhoncus tempor urna sit amet 
       imperdiet.</seg>
  <seg type="a">Integer id ante nunc. Curabitur at ligula sed 
       arcu consequat gravida et id orci. Morbi quis porta 
       dolor.</seg>
  <seg type="a" corresp="#fooid2">Sed dictum<note type="public_note"> 
       sem nec urna sodales cursus. Donec sit amet nibh tempor, 
       congue ligula semper, rhoncus odio.</seg>
<p>
...

Через несколько <xsl:template> s я преобразую xml в HTML, а затем перебираю документ tei для определения элементов, которые необходимо преобразовать в номера сносок в верхнем индексе.,Я использую <xsl:number function> для увеличения числа:

 <xsl:template match="p">
   <div><xsl:apply-templates></div>
 </xsl:template>

 <xsl:template match="seg[@type='a']">
   <p><xsl:apply-templates></p>
 </xsl:template>

 <xsl:template match="seg//date[@type='doc_date'] | 
   seg//note[@type='public_note']">
     <sup>
       <xsl:number count="seg//date[@type='doc_date'] | 
          seg//note[@type='public_note']" format="1" level="any"/>
     </sup>
 </xsl:template>

Производим три <sup/> с инкрементными значениями 1, 2, 3:

<div>
   <p><sup>1</sup>In non hendrerit metus. Sed in 
       posuere eros, sit amet pharetra lacus.</p>
   <p>Nullam semper varius justo, vitae mollis turpis 
       dapibus sit amet. Donec<sup>2</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>3</sup> nec urna sodales cursus. 
      Donec sit amet nibh tempor, congue ligula semper, 
      rhoncus odio.</p>
<div>

Проблема, которую я не могукажется, решить, как вывести следующее, где <sup> добавляется ПОСЛЕ <p> (на основе <tei:seg>), когда выполняется условие seg[@corresp]:

<div>
   <p><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>

Я могу получить ихработать в отдельных шаблонах (при создании html <p/>), но не в одном шаблоне.Однако наличие отдельных шаблонов перезапускает нумерацию.

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

1 Ответ

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

Вы можете использовать шаблон в другом режиме для создания числа и включения в шаблон элементов seg[@corresp] (как я это сделал в https://xsltfiddle.liberty -development.net / pPqsHUb ), но как xsl:number работает на основе положения узлов в исходном документе, вы не получаете порядок, который вы указали, поскольку в основном элементы seg[@corresp] таким образом нумеруются с меньшими номерами, как их дочерние или потомковые элементы date или note,

Так что, в принципе, я думаю, что вам нужно выполнить двухэтапное преобразование, добавить note или date или другой элемент маркера в конце seg[@corresp], затем пронумеровать их и note /date на втором шаге:

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

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:mode name="add-marker" on-no-match="shallow-copy"/>

  <xsl:template match="seg[@corresp]" mode="add-marker">
      <xsl:next-match/>
      <marker/>
  </xsl:template>

  <xsl:variable name="markers-added">
      <xsl:apply-templates mode="add-marker"/>
  </xsl:variable>

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

 <xsl:template match="p">
   <div><xsl:apply-templates/></div>
 </xsl:template>

 <xsl:template match="seg[@type='a']">
   <p><xsl:apply-templates/></p>
 </xsl:template>

 <xsl:template match="seg//date[@type='doc_date'] | 
   seg//note[@type='public_note'] | marker">
     <xsl:apply-templates select="." mode="number"/>
 </xsl:template>

 <xsl:template match="*" mode="number">
     <sup>
        <xsl:number count="marker | seg//date[@type='doc_date'] | 
          seg//note[@type='public_note']" format="1" level="any"/>         
     </sup>
 </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / pPqsHUb / 1

Я использовал декларацию XSLT 3 xsl:modeтам, но он может быть заменен шаблоном преобразования идентификаторов, например

<xsl:template match="@* | node()" mode="add-marker">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()" mode="#current"/>
  </xsl:copy>
</xsl:template>

для процессора XSLT 2.

...