Выровнять элементы xml через xslt, используя информацию выравнивания из атрибутов - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы выровнять несколько переводов текста в кодировке 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 содержит информацию о выравнивании. Я хотел бы выбрать s-элемент в div-элементах в соответствии с этой информацией о выравнивании.

С помощью следующего 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>

Любая помощь будет оценена!

1 Ответ

2 голосов
/ 06 марта 2020

Если я правильно понимаю необходимые логи c (?), Вы могли бы сделать что-то вроде:

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>

Обратите внимание, что ячейки последней строки пусты. Я не уверен, какой должен быть правильный результат.

...