首页 > 解决方案 > XSLT 2.0 协调多种模式

问题描述

XSLT 2.0、样式表和数据位于https://xsltfiddle.liberty-development.net/bFDb2D3/4

我正在将用 tei-xml 编码的中世纪文档转换成网页,用户可以在其中切换文档的两个不同视图,以及查看翻译和各种脚注(例如)。这需要多层处理才能输出:

我正在使用modes以处理处理级别,并且每种模式本身都可以正常工作,但是它们一起缺少输出。

应该输出什么:

  1. <div class="inter"><p>使用所有转换模式inter+ fn-add-marker [这应该包含<a href>, 文本中的上标字母和数字]

  2. <div class="diplo"><p>使用所有转换模式diplo+ fn-add-marker [这应该包含 [text] 、行号、上标字母和文本中的数字]

  3. <div><p>带翻译

  4. <div>与关键设备

  5. <div>带脚注

XSLTfiddle 输出为:

  1. URL和上标字母ok!缺少上标数字(模式fn-add-marker
  2. 上标字母ok!行 # 和 [text]可以,除了在内部<persName><placeName>(即<xsl:template match="tei:lb"> <xsl:template match="tei:supplied">)和缺少上标数字(模式fn-add-marker)的地方
  3. 好的!
  4. 好的!
  5. 好的!

关于 #2,缺少的行 # 和 [text] 似乎是模板处理<persName><placeName>不是移交给其他模板的结果?(第 173-218 行的模板)

所有关于模式的模板fn-add-marker都在第 41-77 行。

提前谢谢了。

标签: xsltxslt-2.0tei

解决方案


基本上在 XSLT 2 中,一旦您使用命名模式,您需要确保在属于特定模式的模板中,例如mode="foo",您在任何内部使用 egmode="foo"或更通用,以确保在该模式下继续处理。有关详细信息,请参阅https://www.w3.org/TR/xslt20/#element-apply-templatesmode="#current"xsl:apply-templates

https://xsltfiddle.liberty-development.net/gWmuiK7我尝试使用 XSLT 修复您的样式表,然后在https://xsltfiddle.liberty-development.net/bFDb2D3/5您可以看到应用固定样式表的结果. 不确定这种编程方法是否是正确的工具,但它可能有助于modexsl: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 行。


推荐阅读