XSLT统计TEI文档tei:lb标签并嵌入行号展示功能集成求助
原代码失效原因
你之前编写的XPath条件逻辑存在根本性错误:tei:lb[tei:lb[position() mod 5 = 0]] 这个表达式的含义是查找自身包含子<tei:lb>节点、且子节点位置模5等于0的<tei:lb>,完全不符合统计全局所有<tei:lb>顺序的需求。此外默认position()函数仅统计当前父节点下的子节点顺序,跨层级的TEI结构会直接导致计数错误。
正确集成方案
你可以直接在现有<tei:lb>转换模板的注释标注位置插入以下代码,完全适配结构各异的TEI文件,无需调整原有连字符、换行逻辑:
<!-- 计算当前tei:lb的全局唯一序号 --> <xsl:variable name="currentLineNum" select="count(//tei:lb[. << current()]) + 1"/> <!-- 每n行插入带行号的span标签,此处n=5可自行修改模数调整间隔 --> <xsl:if test="$currentLineNum mod 5 = 0"> <span class="tei-line-number" data-line="{$currentLineNum}"> <xsl:value-of select="$currentLineNum"/> </span> </xsl:if>
补充说明
- 上述代码适用于XSLT 2.0及以上版本,如果使用XSLT 1.0,将变量定义替换为兼容写法即可:
<xsl:variable name="currentLineNum" select="count(//tei:lb[generate-id(.) != generate-id(current()) and count(. | current()/preceding::tei:lb) = count(current()/preceding::tei:lb)]) + 1"/> - 如需统计所有
<tei:lb>的总数量,直接调用count(//tei:lb)即可获取。
内容的提问来源于stack exchange,提问作者KWunsch
相关产品推荐
相关产品推荐

