在祖先章节级别计算创建的行
Counting created lines on ancestor chapter level
我正在处理具有这样基本结构的 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,我现在正在尝试执行以下已经有效的步骤:
- 将每章内的mainText-div替换为
<ab/>
- 用元素
<reg/>
和 <orig/>
替换标准化和 OCR 版本
- 将
<p>
替换为线组元素 <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 元素内开始计数。很乐意提供帮助。
最好的,
多米尼卡
试试这个:
<?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>
查看转换
我正在处理具有这样基本结构的 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,我现在正在尝试执行以下已经有效的步骤:
- 将每章内的mainText-div替换为
<ab/>
- 用元素
<reg/>
和<orig/>
替换标准化和 OCR 版本
- 将
<p>
替换为线组元素<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 元素内开始计数。很乐意提供帮助。
最好的, 多米尼卡
试试这个:
<?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>
查看转换