我想对齐TEI编码文本的多个翻译,并通过xslt将其转换为html。
xml(改编自https://www.tei-c.org/release/doc/tei-p5-doc/en/html/ref-linkGrp.html)看起来像这样:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="mini.xsl"?>
<TEI>
<linkGrp type="translation">
<link target="#CCS1 #SW1"/>
<link target="#CCS2 #SW2"/>
<link target="#CCS #SW"/>
</linkGrp>
<div type="volume" xml:id="CCS"
xml:lang="fr">
<p>
<s xml:id="CCS1">Longtemps, je me suis couché de bonne heure.</s>
<s xml:id="CCS2">Parfois, à peine ma bougie éteinte, mes yeux se fermaient si vite que je n'avais pas le temps de me dire : "Je m'endors."</s>
</p>
<!-- ... -->
</div>
<div type="volume" xml:id="SW" xml:lang="en">
<p>
<s xml:id="SW1">For a long time I used to go to bed early.</s>
<s xml:id="SW2">Sometimes, when I had put out my candle, my eyes would close so quickly that I had not even time to say "I'm going to sleep."</s>
</p>
<!-- ... -->
</div>
</TEI>
linkGrp
元素包含对齐信息。我想根据这个对齐信息选择div元素中的s元素。
使用以下xsl文件,我可以自己输出属性值,但我不知道如何抓取和输出相应的行:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="TEI/linkGrp">
<xsl:apply-templates select="link"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="link">
<xsl:value-of select="@target"/>
</xsl:template>
</xsl:stylesheet>
我试图得到的是一个简单的html表,它的一侧有#CCS行,另一侧有#SW,即:
<table>
<tr>
<td>Longtemps, je me suis couché de bonne heure.</td>
<td>For a long time I used to go to bed early.</td>
</tr>
<tr>
<td>Parfois, à peine ma bougie éteinte, mes yeux se fermaient si vite que je n'avais pas le temps de me dire : "Je m'endors."</td>
<td>Sometimes, when I had put out my candle, my eyes would close so quickly that I had not even time to say "I'm going to sleep."</td>
</tr>
</table>
任何帮助都将不胜感激!
如果我正确理解所需的逻辑(?(,您可以执行以下操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:key name="s" match="s" use="concat('#', @xml:id)" />
<xsl:template match="/TEI">
<table>
<xsl:for-each select="linkGrp/link">
<tr>
<td>
<xsl:value-of select="key('s', substring-before(@target, ' '))"/>
</td>
<td>
<xsl:value-of select="key('s', substring-after(@target, ' '))"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
应用于您的输入示例,这将产生:
结果
<table>
<tr>
<td>Longtemps, je me suis couché de bonne heure.</td>
<td>For a long time I used to go to bed early.</td>
</tr>
<tr>
<td>Parfois, à peine ma bougie éteinte, mes yeux se fermaient si vite que je n'avais pas le temps de me dire : "Je m'endors."</td>
<td>Sometimes, when I had put out my candle, my eyes would close so quickly that I had not even time to say "I'm going to sleep."</td>
</tr>
<tr>
<td/>
<td/>
</tr>
</table>
请注意,最后一行的单元格为空。我不确定正确的结果应该是什么。