使用属性中的对齐信息通过xslt对齐xml元素



我想对齐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>

请注意,最后一行的单元格为空。我不确定正确的结果应该是什么。

最新更新