XSLT输出到HTML:基于另一个元素,添加具有递增编号的HTML元素

时间:2018-10-17 13:35:14

标签: xslt tei

我有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>中,我将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/>),但不能在一个模板中工作。但是,在单独的模板中会重新开始编号。

非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以在其他模式下使用模板来创建数字,并将seg[@corresp]元素包括在模式中(就像我在https://xsltfiddle.liberty-development.net/pPqsHUb中所做的那样),但是xsl:number可以根据节点在源文档中的位置没有得到您基本上表示为seg[@corresp]元素的顺序,因此以较低的数字编号为其子元素或后代datenote元素。

因此,基本上我认为您需要进行两步转换,在note的末尾添加dateseg[@corresp]或其他标记元素,然后为它们和{ {1}} / note,第二步:

date

https://xsltfiddle.liberty-development.net/pPqsHUb/1

我在其中使用了XSLT 3 <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> 声明,但是可以用身份转换模板代替它,例如

xsl:mode

用于XSLT 2处理器。