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

2023-12-04

这个问题建立在我对我的回答的基础上原问题,有人建议我发布后续内容。这涉及到尝试集成上一篇文章中的 XSL 代码。

在上一个问题中,我提出了 TEI:XML 文档的简化版本,我正在使用 XSLT 2.0 将其转换为 HTML(完整的 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 内部触发的。

非常感谢!


我认为,除非您想在该模板匹配中为所有路径添加前缀/使用我建议存储标记插入结果的变量,将现有代码与我的建议合并的一种方法是将匹配从/ to /*例如使用

<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会选择任何内容,但也许这是样本中的遗漏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • C# 中的哈希密码和盐密码

    我刚刚浏览了 DavidHayden 的一篇文章对用户密码进行哈希处理 真的 我无法得到他想要达到的目标 这是他的代码 private static string CreateSalt int size Generate a cryptog
  • 使用 maltpoltlib 对带有轮廓的 pcolormesh 进行动画处理

    我正在做一些事情 我需要可视化时间和表面上的进展 比如说热量 我在使用轮廓对 pcolormesh 进行动画处理时遇到一些麻烦 轮廓确实是动画的 但 pcolormesh 不是 我只得到第一个从未被替换的 我的代码很像这样 x y and
  • 使用 Javascript 从 Web 应用程序访问设备指南针

    是否可以通过网络应用程序在 iPhone Android 设备上使用 Javascript 访问指南针 已经在网上找了好几个小时了 我知道你可以通过以下方式访问加速度计 window ondevicemotion 函数 事件 有谁知道是否可
  • 在VS2019中连接Entity Framework与MYSQL

    我刚刚安装了 Visual Studio 2019 并尝试添加具有 ADO NET 实体模型的数据库 但向导在此步骤中崩溃了 选择实体框架版本 我有 Visual Studio Community 2019 v16 4 5安装 MySQL
  • 列表项项目符号重叠

    我有一个无序列表 我希望将其列表项显示为两行多列 问题在于每个列表项的项目符号与前一个列表项重叠 我该如何阻止这种情况发生 我已经找到了一个调整边距的混乱解决方案 但想知道是否有一个优雅的解决方案 我想保留子弹 我不希望列表项中的文本环绕项
  • 使用 cURL 编辑 GIST

    bin bash COMMIT git log 1 pretty format subject s name xxx date cD curl X PATCH d files latest commit content COMMIT u u
  • 如何将 Cassandra 的本地节点复制到其他 Cassandra 的远程节点?

    我需要使用 SimpleStrategy 将本地节点复制到其他 Cassandra 数据库中的远程节点 有人知道我从哪里开始吗 如果您要将数据写入两个集群 那么这里的主要复杂性是如何避免覆盖在本地设置之后在云中更改的数据 有几种可能性可以做
  • 如何在“电话:”链接中提供拨打分机号的选项?

    将电话链接设置为 a href Dial a 从移动浏览器中单击它 只有初始号码会传输到拨号器 而不是逗号或扩展名 我试过了p w and ext 也一样 但没有任何作用 p and w分别更改为 7 和 9 使用 Moto X 第一代进行
  • python中小于负无穷大的数字? [复制]

    这个问题在这里已经有答案了 这在 python2 中是可能的 None lt float inf 还有 它always returns True 然而 在 python3 上 这会抛出 TypeError unorderable types
  • 为多个用户主动安装/推送团队中的应用程序

    我有一个关于如何在 Teams 中为多个用户主动安装 推送应用程序 的疑问 我们已将 Bot 应用程序添加为 Teams 应用程序目录的一部分 并且我按照以下有关 Microsoft Teams 中的管理应用程序设置策略的文档来安装应用程序
  • 地图和法律提及

    在 iOS 我的问题是我必须向我的地图添加页脚子视图 它将隐藏合法链接 如何解决这个问题而不被 App Store 拒绝 我可以自己创建另一个合法按钮并将其添加到地图视图中我想要的位置吗 我不知道我能做什么 有一些答案建议您将合法标签移至v
  • Html.Partial 与 Html.RenderPartial 和 Html.Action 与 Html.RenderAction

    在 ASP NET MVC 中 有什么区别 Html Partial and Html RenderPartial Html Action and Html RenderAction Html Partial返回一个字符串 Html Ren
  • 当前上下文中不存在名称“ViewBag”

    我正在尝试在我的应用程序中使用 ViewBag 我拥有所有最近的 dll 最新版本的 MVC 3 但我仍然收到错误 名称 ViewBag 在当前上下文中不存在 我什至卸载并重新安装了 MVC 3 但没有任何变化 另外 我不相信 dll 会出
  • 通过 Gmail 发送电子邮件

    我有一个代码 用于发送电子邮件 Intent i new Intent Intent ACTION SEND i setType text plain i putExtra Intent EXTRA EMAIL new String to
  • 计算中使用的提示或宏变量

    我使用 EG 中的提示管理器创建了一个数字变量 该变量称为 HYr 代表我提取的数据最高年份 运行程序时 我根据最高年份创建了 4 个新变量 这就是我遇到问题的地方 我有以下内容 Let Yr2 HYr 1 Let Yr3 HYr 2 Le
  • Vapor 4:如何将急切加载的父关系映射为不同的格式?

    我在如何返回包含父关系的模型 同时将急切加载的模型映射到不同的形式方面遇到了一些困难 让我们考虑以下 2 个模型 Course and User final class Course Model Content static let sch
  • docker-compose 主机和容器上的持久数据

    我在 docker compose yml 3 0 中遇到卷问题 所以我知道一个卷的行为就像一个挂载 但是我已经设置了一个wiki 当我在docker compose中设置一个卷时 容器上的数据将被删除 隐藏 那么我怎样才能先将数据从容器保
  • 递归搜索并删除数组?

    我正在使用一个多维数组 我希望能够删除与 id 匹配的数组 和所有子数组 我尝试过的功能是 function removeKey key array childKey children if isset array key unset ar
  • 浮动/浮动=奇怪的结果

    我有两个值 一个来自用户输入 另一个来自数据库 var userinput form someInput var valuefromDB GetValue someNumber public float GetValue int id re
  • XSLT 2.0 通过多阶段转换在 HTML 输出中创建增量脚注编号

    这个问题建立在我对我的回答的基础上原问题 有人建议我发布后续内容 这涉及到尝试集成上一篇文章中的 XSL 代码 在上一个问题中 我提出了 TEI XML 文档的简化版本 我正在使用 XSLT 2 0 将其转换为 HTML 完整的 tei 文