我正在研究一个具有这样基本结构的TEI文档。章节中有几个“mainText”部分;这些部分具有单独的实际文本的规范化和OCR版本。
<div type="chapter">
<div type="mainText">
<div type="normalized">
<p>HERE COMES <lb/> SOME TEXT<lb/></p>
</div>
<div type="OCR">
<p>HERE COMES <lb/> SOME TEXT<lb/></p>
</div>
</div>
<div type="mainText">
<div type="normalized">
<p>HERE COMES <lb/> SOME TEXT<lb/></p>
</div>
<div type="OCR">
<p>HERE COMES <lb/> SOME TEXT<lb/></p>
</div>
</div>
</div>
使用XSLT 2.0我现在正在尝试执行以下步骤,这些步骤已经有效:
<ab/>
<reg/>
和<orig/>
<p>
替换为linegroup元素<lg>
<lb/>
结尾的组包裹在一个行元素<l/>
我的问题如下:我想为每一行分配一个行号属性,但在章级别上,意思是:在章节中有一个连续的行计数器。查看我当前使用行的xsl模板:
<!-- replace p with linegroup -->
<xsl:template match="text//p">
<xsl:choose>
<!-- don't apply lingroup when there is nothing inside of p -->
<xsl:when test="not(node())">
<xsl:apply-templates/>
</xsl:when>
<xsl:otherwise>
<lg>
<!-- make a group out of everything inside of p, ending with a linebreak -->
<xsl:for-each-group select="node()" group-ending-with="lb">
<!-- wrap a line aroung current group -->
<l>
<!-- for line element create number, if line is in mainText -->
<xsl:attribute name="n">
<xsl:number/>
</xsl:attribute>
<xsl:apply-templates select="current-group()"/>
</l>
</xsl:for-each-group>
</lg>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- get rid if linebreak, as we don't need it anymore -->
<xsl:template match="p//lb"/>
此输出将创建行号,但在每个mainText元素内开始计数。很乐意帮忙。
最佳, 多米妮卡
答案 0 :(得分:0)
试试这个:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- remove disallowed elements but keep its children -->
<xsl:template match="div">
<xsl:element name="{if(@type='mainText') then 'ab' else
if(@type='normalized') then 'reg' else
if(@type='OCR') then 'orig' else 'div'}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="p//lb"/>
<xsl:template match="p">
<lg>
<xsl:choose>
<xsl:when test="not(node())">
<xsl:apply-templates/>
</xsl:when>
<xsl:otherwise>
<xsl:for-each-group select="node()" group-ending-with="lb">
<!-- wrap a line aroung current group -->
<l>
<!-- for line element create number, if line is in mainText -->
<xsl:attribute name="n">
<xsl:variable name="num">
<xsl:number count="lb" level="any"/>
</xsl:variable>
<xsl:value-of select="if ($num = '') then 1 else number($num) + 1"/>
</xsl:attribute>
<xsl:apply-templates select="current-group()"/>
</l>
</xsl:for-each-group>
</xsl:otherwise>
</xsl:choose>
</lg>
</xsl:template>
</xsl:stylesheet>
处的转化