基于拉丁化字符自动为TEI元素添加@correspUnic属性求助
解决方案与XSL代码修改建议
核心思路
通过身份转换模板保留原TEI文档的所有结构,再针对指定元素(w/g/unclear/name/seg/supplied)单独处理,添加@correspUnic属性——属性值通过预定义的拉丁字符与乌加里特Unicode十进制编码的映射,转换元素内的文本内容得到。
完整XSL代码示例
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://www.tei-c.org/ns/1.0"> <!-- 身份转换:默认复制所有节点、属性、文本 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 定义拉丁字符到乌加里特Unicode十进制编码的映射表 --> <!-- 请根据你的拉丁化方案调整对应关系,以下为示例 --> <xsl:variable name="char-map"> <map entry="a" code="73728"/> <!-- U+12000 乌加里特字母Aleph --> <map entry="b" code="73729"/> <!-- U+12001 乌加里特字母Beth --> <map entry="g" code="73730"/> <!-- U+12002 乌加里特字母Gimel --> <map entry="d" code="73731"/> <!-- U+12003 乌加里特字母Daleth --> <!-- 继续添加其他字符的映射 --> </xsl:variable> <xsl:key name="char-code" match="map" use="@entry"/> <!-- 匹配目标TEI元素,添加correspUnic属性 --> <xsl:template match="tei:w|tei:g|tei:unclear|tei:name|tei:seg|tei:supplied"> <xsl:copy> <!-- 复制原元素的所有属性 --> <xsl:apply-templates select="@*"/> <!-- 生成correspUnic属性 --> <xsl:attribute name="correspUnic"> <xsl:value-of select=" string-join( for $char in string-to-codepoints(.) return if (key('char-code', codepoints-to-string($char), $char-map)) then key('char-code', codepoints-to-string($char), $char-map)/@code else '' <!-- 无映射的字符留空或做其他处理 --> , ' ' ) "/> </xsl:attribute> <!-- 复制原元素的子内容 --> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键修改点与注意事项
- 映射表调整:你必须根据自己使用的拉丁化转写规则,完善
<xsl:variable name="char-map">里的对应关系,确保每个拉丁字符都匹配正确的乌加里特Unicode十进制编码。 - XSLT版本:代码使用XSLT 2.0特性(
string-to-codepoints/codepoints-to-string/for-each循环),Oxygen XML Editor 23.1完全支持,需确保在转换配置中选择XSLT 2.0处理器。 - 字符大小写处理:如果你的拉丁化文本包含大写字母,可在映射表中添加大写条目,或在转换时用
lower-case(.)统一转小写后匹配。 - 无效代码排查:你的原有代码无效可能的原因:
- 未正确绑定TEI命名空间(需在
xsl:stylesheet中声明xmlns:tei="http://www.tei-c.org/ns/1.0",否则匹配不到TEI元素) - 字符映射逻辑错误(比如用了不支持的字符串处理方式,或映射表查找失败)
- 未保留原元素的属性和子节点(身份转换模板缺失导致结构丢失)
- 未正确绑定TEI命名空间(需在
测试验证
- 在Oxygen中打开你的TEI文档,加载上述XSL代码
- 运行XSL转换,查看目标元素是否正确添加
@correspUnic属性 - 若部分字符未转换,检查映射表的
entry值是否与文本字符完全匹配(注意空格、特殊符号等)
内容的提问来源于stack exchange,提问作者Vanessa
相关产品推荐
相关产品推荐

