XSLT 2.0通过多阶段转换在HTML输出中创建增量脚注编号

时间:2018-10-17 17:12:31

标签: xslt tei

此问题基于对我的original question的答复,建议我发布后续消息。这涉及尝试集成上一篇文章中的XSL代码。

在上一个问题中,我介绍了我正在使用XSLT 2.0转换为HTML的TEI:XML文档的简化版本(完整的tei文件和当前的xslt可以在https://xsltfiddle.liberty-development.net/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,因为此转换是使用Xquery 3.1在eXist-DB内部触发的。

非常感谢!

1 个答案:

答案 0 :(得分:1)

我认为,除非您想在模板/中使用与我建议存储变量插入结果的变量相匹配的模板作为前缀,否则将现有代码与我的建议合并的一种方法是更改从//*的匹配,例如使用

<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,据我所见,从代码段中可以看到,在原始输入文档的节点上使用该变量不会受到引入a的影响。临时结果添加了标记,但是对我来说,在那个地方继续处理原始输入而其余部分对临时结果起作用会令我感到不适,因此我倾向于将变量声明更改为

<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开头的路径的全局变量将如何选择任何内容,但也许是示例中的遗漏之处。