xslt - XSLT 输出到 HTML:基于另一个元素添加一个带有递增数字的 HTML 元素
问题描述
我有一些tei:xml
文档,我正在使用 XSLT 2.0 将其转换为 HTML。tei 文档的有效结构如下所示:
...
<p xml:lang="LA">
<seg type="a" corresp="#fooid"><date type="doc_date" when="1245"/>In non hendrerit metus. Sed in
posuere eros, sit amet pharetra lacus.</seg>
<seg type="a">Nullam semper varius justo, vitae mollis turpis
dapibus sit amet. Donec<note type="public_note"></note>
rhoncus tempor urna sit amet
imperdiet.</seg>
<seg type="a">Integer id ante nunc. Curabitur at ligula sed
arcu consequat gravida et id orci. Morbi quis porta
dolor.</seg>
<seg type="a" corresp="#fooid2">Sed dictum<note type="public_note">
sem nec urna sodales cursus. Donec sit amet nibh tempor,
congue ligula semper, rhoncus odio.</seg>
<p>
...
在几个 <xsl:template>
s 中,我将 xml 转换为 HTML,然后循环浏览 tei 文档以识别需要转换为上标脚注编号的元素。我使用<xsl:number function>
来增加数字:
<xsl:template match="p">
<div><xsl:apply-templates></div>
</xsl:template>
<xsl:template match="seg[@type='a']">
<p><xsl:apply-templates></p>
</xsl:template>
<xsl:template match="seg//date[@type='doc_date'] |
seg//note[@type='public_note']">
<sup>
<xsl:number count="seg//date[@type='doc_date'] |
seg//note[@type='public_note']" format="1" level="any"/>
</sup>
</xsl:template>
产生三个<sup/>
增量值为 1、2、3:
<div>
<p><sup>1</sup>In non hendrerit metus. Sed in
posuere eros, sit amet pharetra lacus.</p>
<p>Nullam semper varius justo, vitae mollis turpis
dapibus sit amet. Donec<sup>2</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>3</sup> nec urna sodales cursus.
Donec sit amet nibh tempor, congue ligula semper,
rhoncus odio.</p>
<div>
我似乎无法解决的问题是如何输出以下内容,在满足条件时(基于)<sup>
添加:<p>
<tei:seg>
seg[@corresp]
<div>
<p><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>
我可以让它们在单独的模板中工作(在创建 html 时<p/>
),但不能在一个模板中工作。但是,在单独的模板中会重新开始编号。
提前谢谢了。
解决方案
您可以在不同的模式下使用模板来创建数字并在模式中包含元素(正如我在https://xsltfiddle.liberty-development.net/pPqsHUbseg[@corresp]
中所做的那样),但作为基于节点位置的作品源文档你没有得到你所指示的顺序,因为基本上这些元素以较低的数字作为它们的子元素或后代元素编号。xsl:number
seg[@corresp]
date
note
所以基本上我认为你需要运行一个两步转换,在末尾添加一个note
or或其他标记元素,然后在第二步中对它们和/进行编号:date
seg[@corresp]
note
date
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:mode name="add-marker" on-no-match="shallow-copy"/>
<xsl:template match="seg[@corresp]" mode="add-marker">
<xsl:next-match/>
<marker/>
</xsl:template>
<xsl:variable name="markers-added">
<xsl:apply-templates mode="add-marker"/>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="$markers-added/node()"/>
</xsl:template>
<xsl:template match="p">
<div><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="seg[@type='a']">
<p><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="seg//date[@type='doc_date'] |
seg//note[@type='public_note'] | marker">
<xsl:apply-templates select="." mode="number"/>
</xsl:template>
<xsl:template match="*" mode="number">
<sup>
<xsl:number count="marker | seg//date[@type='doc_date'] |
seg//note[@type='public_note']" format="1" level="any"/>
</sup>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/pPqsHUb/1
我xsl:mode
在那里使用了 XSLT 3 声明,但它可以被身份转换模板替换,例如
<xsl:template match="@* | node()" mode="add-marker">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="#current"/>
</xsl:copy>
</xsl:template>
对于 XSLT 2 处理器。
推荐阅读
- c# - 如何按照一定的规则组织收藏?
- python - 星号 `*` 在 Python 3 中的字符串格式化方法 `.format(*) 中如何工作?
- java - 添加新行为时 SPI 应如何演变
- git - 试图用合并的分支重写历史(rebase -i)
- javascript - 通过nodeJS TLS Socket发送请求的最佳方式是什么
- json - 我怎么能在子模块中使用相同的 tslint.json 呢?
- java - 处理程序和接口可运行 - 具有新线程
- visual-studio-2017 - 在 Visual Studio 2017 中更改窥视窗口的颜色不起作用
- powerquery - 如何将excel单元格作为查询参数的源文件?
- angular - Angular 6 - 反应式表单内的自定义控件