xml以使用xsl

时间:2018-10-03 17:09:07

标签: 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 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 :(得分: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