xslt - XSLT 2.0 协调多种模式
问题描述
XSLT 2.0、样式表和数据位于https://xsltfiddle.liberty-development.net/bFDb2D3/4
我正在将用 tei-xml 编码的中世纪文档转换成网页,用户可以在其中切换文档的两个不同视图,以及查看翻译和各种脚注(例如)。这需要多层处理才能输出:
- 两个拉丁版本(“inter”和“diplo”),用户可以在它们之间切换(源自相同的 tei 标记)
- 几乎没有转换的翻译版本(只有段落格式和斜体)
- 使用脚注 # a、b、c 等的关键设备。
- 使用脚注 #1、2、3 等的历史脚注。
我正在使用modes
以处理处理级别,并且每种模式本身都可以正常工作,但是它们一起缺少输出。
应该输出什么:
<div class="inter"><p>
使用所有转换模式inter
+fn-add-marker
[这应该包含<a href>
, 文本中的上标字母和数字]<div class="diplo"><p>
使用所有转换模式diplo
+fn-add-marker
[这应该包含 [text] 、行号、上标字母和文本中的数字]<div><p>
带翻译<div>
与关键设备<div>
带脚注
XSLTfiddle 输出为:
- URL和上标字母ok!缺少上标数字(模式
fn-add-marker
) - 上标字母ok!行 # 和 [text]可以,除了在内部
<persName>
或<placeName>
(即<xsl:template match="tei:lb">
<xsl:template match="tei:supplied">
)和缺少上标数字(模式fn-add-marker
)的地方 - 好的!
- 好的!
- 好的!
关于 #2,缺少的行 # 和 [text] 似乎是模板处理<persName>
而<placeName>
不是移交给其他模板的结果?(第 173-218 行的模板)
所有关于模式的模板fn-add-marker
都在第 41-77 行。
提前谢谢了。
解决方案
基本上在 XSLT 2 中,一旦您使用命名模式,您需要确保在属于特定模式的模板中,例如mode="foo"
,您在任何内部使用 egmode="foo"
或更通用,以确保在该模式下继续处理。有关详细信息,请参阅https://www.w3.org/TR/xslt20/#element-apply-templates。mode="#current"
xsl:apply-templates
在https://xsltfiddle.liberty-development.net/gWmuiK7我尝试使用 XSLT 修复您的样式表,然后在https://xsltfiddle.liberty-development.net/bFDb2D3/5您可以看到应用固定样式表的结果. 不确定这种编程方法是否是正确的工具,但它可能有助于mode
在xsl: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 行。
推荐阅读
- hyperledger-fabric - Hyperledger Fabric 链码错误:无法引用未导出的名称 shim.success
- opencl - 执行 OpenCL 零拷贝
- html - 半星和体透明星
- python - 在 django 中计算 2 小时之间的时间
- matlab - 如何在两个现有节点之间添加新节点
- cookies - JMeter 无法使用用户定义的变量捕获 cookie
- html - 我需要对有角度的表单进行验证
- javascript - 获取选择器选项的 URL 并将其添加为提交按钮的链接
- java - 检查用户何时没有在 JTextArea 中输入任何内容
- excel - 将时间戳添加到Excel工作表的方法