TEI指针模式解析:是否有XSLT(≤2.0)实现方案?
TEI指针模式的XSLT 2.0及以下版本实现方案
- 针对TEI推荐的各类扩展指针模式(比如
@corresp="#range(#id1, #id5)"这类范围指针),确实有可直接复用的XSLT 2.0实现思路,无需依赖外部工具。 - 核心实现逻辑分为两步:首先通过字符串匹配提取指针中的关键参数,再结合XSLT内置函数定位目标节点。
- 以
range()指针为例,可编写如下自定义函数解析:
<xsl:function name="tei:resolve-range-pointer" as="node()*"> <xsl:param name="pointer" as="xs:string"/> <!-- 匹配range格式的指针语法 --> <xsl:if test="matches($pointer, '^#range\(#([^,]+), #([^)]+)\)$')"> <!-- 提取起始和结束节点的ID --> <xsl:variable name="start-id" select="replace($pointer, '^#range\(#([^,]+), #([^)]+)\)$', '$1')"/> <xsl:variable name="end-id" select="replace($pointer, '^#range\(#([^,]+), #([^)]+)\)$', '$2')"/> <!-- 获取文档顺序中从起始到结束的所有节点序列 --> <xsl:sequence select=" id($start-id) | id($start-id)/following-sibling::node()[. << id($end-id)] | id($end-id) "/> </xsl:if> </xsl:function>
- 在处理TEI元素的
@corresp属性时,可通过条件判断调用对应解析逻辑:
<xsl:template match="*[@corresp]"> <xsl:variable name="target-nodes" as="node()*"> <xsl:choose> <xsl:when test="matches(@corresp, '^#range\(.*\)$')"> <xsl:sequence select="tei:resolve-range-pointer(@corresp)"/> </xsl:when> <xsl:otherwise> <!-- 处理普通单个ID指针 --> <xsl:sequence select="id(substring-after(@corresp, '#'))"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- 此处添加对目标节点的后续处理逻辑 --> </xsl:template>
- 对于TEI支持的其他指针模式(如
xpath()),XSLT 2.0可直接通过xsl:evaluate指令执行提取出的XPath表达式,实现快速解析。 - 注意:如果
range()指针跨越的节点并非同层级连续结构,需要根据实际文档结构调整节点序列的筛选逻辑,确保覆盖所有符合范围的节点。
内容的提问来源于stack exchange,提问作者oleksii.sapov-erlinger
相关产品推荐
相关产品推荐

