我需要帮助将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>
答案 0 :(得分:0)
似乎您可以将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>
https://xsltfiddle.liberty-development.net/3NzcBtN上的完整XSLT 3示例。
您也可以使用位置分组:
<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>
位于https://xsltfiddle.liberty-development.net/3NzcBtN/2的XSLT 3示例,其中生成的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