0

This question builds on the responses to my original question, where it was suggested that I post a followup. This concerns attempting to integrate the XSL code from the previous post.

In the previous question I presented a simplified version of the TEI:XML document I am transforming into HTML using XSLT 2.0 (the full tei file and current xslt can be found here https://xsltfiddle.liberty-development.net/bdxtqT/6). This is a fuller view of the hierarchy, but not all details:

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

The desired HTML output is as follows. Incremental footnote numbers are created in <sup> based on one of three conditions:

  • date[@type="deposition_date"] (add footnote no.),

  • seg[@type="typefoo"] (add footnote no.)

  • note[@type="public_note"] (replace with footnote no.).

Desired output

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

The full XSLT transformation document is found at https://xsltfiddle.liberty-development.net/bdxtqT/6, where one can see the following problems:

  • date[@type='deposition_date'] is being entirely replaced, instead receiving an added footnote marker
  • seg[@type='dep_event' and @corresp] is not receiving an added footnote marker, but it appears in the <div> at the bottom of the page.

The XSL file is too long and doesn't seem to paste here correctly. Interact with files here https://xsltfiddle.liberty-development.net/bdxtqT/6.

NB: I am restricted to XSLT 2.0 as this transformation is fired off inside eXist-DB with Xquery 3.1.

Thanks very much!

jbrehr
  • 775
  • 6
  • 19

1 Answers1

1

I think, unless you want to prefix all your paths in that template matching / with the variable I suggested to store the result of the marker insertion, one way to merge the existing code with my suggestion is to change the match from / to /* e.g. use

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

that would then mean that my suggestion to use

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

can be kept and the XSLT processor would apply it.

There is however the use of that variable $footnote-sources at the end of the template, as far as I can see from the snippet its use on nodes from the original input document would not be affected by the introduction of a temporary result adding markers but somehow to me it would feel wrong to at that place keep processing the original input while the rest works on the temporary result so I would be inclined to change the variable declaration to

<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]"/>

With those two changes I think my suggestion in the previous answer should then be applied. Although now looking again at the posted source with a tei root element I wonder how a global variable having paths starting with tei:text would select anything but perhaps that is an omission in the sample.

Martin Honnen
  • 160,499
  • 6
  • 90
  • 110
  • Thanks for this, I'm working on integrating it and will report. The tei documents are divided into `teiHeader` and `text` and the teiHeader contains no relevant data for this specific output - but given the `tei` schema's rules, some of the elements I process could appear under that node (like `persName`, etc) and therefore I am forcing the stylesheet to ignore the header completely. It provides a clear separation of data output. It makes me wonder if I shouldn't just convert the other `` to `` ? – jbrehr Oct 17 '18 at 20:15
  • This is the most recent iteration of the fiddle, https://xsltfiddle.liberty-development.net/bdxtqT/6 It's producing a few effects now, but not all.. I've updated the post above with the problems. – jbrehr Oct 17 '18 at 22:28
  • 1
    There is too much input in there to find my way around and check by reading where/whether you want numbers but as for the XSLT, I have made some changes at https://xsltfiddle.liberty-development.net/bdxtqT/9 which basically ensure you use a consistent element name for that "marker" element, for some reasons you had used e.g. `tei:fn-marker` to create the element but in various places to select or match or number you then had used `tei:marker`. Check that whether it improves things, I hope it fixes the problem of `seg[@type='dep_event' and @corresp]` not being followed by a marker – Martin Honnen Oct 18 '18 at 09:08
  • Thanks, all the `` are now showing up as required. The only remaining issue (as I note in the post above) is that the text content of `date[@type='deposition_date']`is disappearing in the HTML output. This element appears only once in each file. – jbrehr Oct 18 '18 at 09:22
  • 1
    There is a single template for `match="tei:date[@type='deposition_date'] | tei:note[@type='public'] | tei:fn-marker"` which then with the `` only outputs the `sup` with the number. That indeed does not output the contents of any of those elements, I have lost track whether that now occurs due to some change or omission I made, but assuming you want to treat that element differently use an extra template ``. – Martin Honnen Oct 18 '18 at 10:05
  • 1
    And then of course have that previous template only `match="tei:note[@type='public'] | tei:fn-marker"`. – Martin Honnen Oct 18 '18 at 10:05
  • That's done it. If I could give you a bounty I would. – jbrehr Oct 18 '18 at 10:10