XML для соответствия строк с XSL - PullRequest
0 голосов
/ 03 октября 2018

Мне нужна помощь с преобразованием моего XML-файла в HTML-таблицу с двумя столбцами с соответствующими строками.Моя структура файла xml-tei для столбцов

<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader></teiHeader>
<text>
<body>
<div type="poem">
<head n="1"><hi rend="underline">Sjudubaeots'oh</hi></head>
<div type="column1">
<lg>
<l n="1">Jaanguoi<add place="above">goj</add> ninje</l>
<l n="2"><add place="top">Njaar pie<del rend="overstrike">v</del><add 
place="above">b</add>es</add></l> 
<l n="3">Njaar jan|deata</l>
<l n="4">Opoj habidoo</l>
<l n="5">Tab<add place="above">b</add>adooda habih</l>
<l n="6">Njaar jan|deata</l>
</lg>
</div>
<div type="column2">
<lg>
<l n="1" xml:lang="ru">На земили хребты</l>
<l n="2"><add place="top">три братев</add></l>
<l n="3" xml:lang="ru">Три на<note resp="#MAC" place="top" xml:lang="swe">på jorden ej så rika</note> землы оленщик<note resp="#MAC" 
place="above">Deatáh, оленщикъ</note> (богатые)</l>
<l n="4" xml:lang="ru">одинъ работник у ихъ</l>
<l n="5" xml:lang="sw">På <del rend="overstrike">песачиый</del><add 
place="above">худий</add> слуга <note resp="#MAC">(namn) d.ä hans pimi  äro vardsrlösa, utan band, hänga ned (<hi rend="underline">tabbaltaa</hi>) 
</note></l>
<l n="6" xml:lang="sw">Af de tre bröder</l>
</lg>
</div>
</div>
</body>
</text>
</TEI>

Мне нужна таблица с двумя столбцами, в которой будут строки, совпадающие друг с другом.Место линии внутри lg является определяющим (а не n строки).

Это то, что я попробовал, основываясь на предложенном коде.В нем был только один столбец с текстом в столбце 1, следующий за текстом в столбце 2. Я извиняюсь за свой предыдущий вопрос, который показал исходный xml слишком простым и, вероятно, вызвал путаницу.Очевидно, я совершенно невежественен в xslt, но тем более надеюсь, что вы мне поможете.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="3.0">
<xsl:output method="html" html-version="4.0"/>
<xsl:template match="TEI/text/body/div[div[starts-with(@type, 'column')]]">
<table>
<thead><xsl:value-of select="head[@n='1']"/>
</thead>
<xsl:variable name="row-count" select="count(div[1]/lg/l)"/>
<xsl:for-each-group select="div/lg/l" group-by="position() mod $row-count">
<tr>
<xsl:apply-templates select="current-group()"/>
</tr>
</xsl:for-each-group>
</table>
</xsl:template>
<xsl:template match="l">
<td>{ . }</td>
</xsl:template>
</xsl:stylesheet>

1 Ответ

0 голосов
/ 04 октября 2018

Кажется, вы можете сгруппировать элементы l по атрибуту n:

  <xsl:template match="*[div[starts-with(@type, 'column')]]">
      <table>
          <xsl:for-each-group select="div/lg/l" group-by="@n">
              <tr>
                  <xsl:apply-templates select="current-group()"/>
              </tr>
          </xsl:for-each-group>
      </table>
  </xsl:template>

  <xsl:template match="l">
      <td>{ . }</td>
  </xsl:template>

Полный пример XSLT 3 в https://xsltfiddle.liberty -development.net / 3NzcBtN .

В качестве альтернативы вы можете использовать позиционную группировку:

  <xsl:template match="*[div[starts-with(@type, 'column')]]">
      <table>
          <xsl:variable name="row-count" select="count(div[1]/lg/l)"/>
          <xsl:for-each-group select="div/lg/l" group-by="position() mod $row-count">
              <tr>
                  <xsl:apply-templates select="current-group()"/>
              </tr>
          </xsl:for-each-group>
      </table>
  </xsl:template>

  <xsl:template match="l">
      <td>{ . }</td>
  </xsl:template>

XSLT 3 sample at https://xsltfiddle.liberty -development.net / 3NzcBtN / 2 , разметка таблицы HTMLпроизводится

  <table>
     <tr>
        <td>abc</td>
        <td>lmn</td>
     </tr>
     <tr>
        <td>efg</td>
        <td>opq</td>
     </tr>
     <tr>
        <td>hij</td>
        <td>rst</td>
     </tr>
     <tr>
        <td>4</td>
        <td>4</td>
     </tr>
  </table>

, который выглядит как

abc lmn
efg opq
hij rst
4   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...