使用xsl匹配行的xml

使用xsl匹配行的xml,xml,xslt,Xml,Xslt,我需要帮助将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 ren

我需要帮助将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>

Sjudubaeots'oh
贾古伊戈吉·尼杰
Njaar pievbes
Njaar jan|deata
哈比杜奥普酒店
塔巴杜达哈比赫酒店
Njaar jan|deata
На земили хребты
три братев
乔登工程公司(sårikaззззззззззззззззззззз
одинъ работник у ихъ
Påчччччччччччччччччччччч1095
布吕德酒店
我需要一个有两列的表,其中的行相互匹配。线在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>

{ . }

您似乎可以在
n
属性上对
l
元素进行分组:

  <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>

n
属性值是否确定两个
l
元素属于相同的
tr
行?还是
lg
元素内部的位置?无论如何,它看起来可以通过分组来解决,并且在任何情况下都可以告诉我们您使用或可以使用哪个XSLT版本,因为XSLT 2或XSLT 3中的许多事情比XSLT 1中的要简单。感谢您的帮助!您的第二个建议,位置分组,似乎更适合,因为lg元素内部的位置决定了线的匹配。不过,对我来说,两种解决方案都会产生一列分割,其中div列1中的文本后跟div列2中的文本。我希望在两个不同的列中同时看到它们。我链接到的示例显示了带有两列的表输出,我认为正如您所描述的,我现在还编辑了答案,以便您可以直接在StackOverflow上看到结果。我无法告诉您尝试或更改了什么,您需要编辑您的问题并显示详细信息,或者询问一个新问题,并提供必要的详细信息(XML、XSLT、您想要的结果和您得到的结果的最小但完整的示例)来解释问题。谢谢您。
  <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>
  <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