需要将 xhtml 表转换为具有行跨度的 dita 特定表
基本上,如果 rowspan 属性有多个 td 元素,它应该转移到下一列。
改造后的现状:
预期场景:
我在 xslt 中尝试了很多东西,但不知何故,我无法获得预期的结果。
当前 HTML 表格
<table class="gripstable-LT-LineColor width-percent grid-all">
<colgroup>
<col />
<col />
</colgroup>
<tbody class="body">
<tr>
<td rowspan="6">
<p class="para-default">A</p>
</td>
<td>
<p class="para-default">(2) Front circuit supply</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(3) Rear circuit supply</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(4) Rear circuit control</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(5) Parking circuit supply</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(6) Parking circuit control</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(7) Front circuit delivery</p>
</td>
</tr>
<tr>
<td rowspan="6">
<p class="para-default">B</p>
</td>
<td>
<p class="para-default">(2) Rear circuit supply</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(3) Front circuit delivery</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(4) Rear circuit control</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(5) Parking circuit delivery</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(6) Parking circuit control</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(7) Load sensing valve supply</p>
</td>
</tr>
<tr>
<td rowspan="2">
<p class="para-default">C</p>
</td>
<td>
<p class="para-default">(1) Air supply</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(2) Air compressor governor signal</p>
</td>
</tr>
<tr>
<td rowspan="1">
<p class="para-default">D</p>
</td>
<td>
<p class="para-default">(2) Front parking circuit delivery</p>
</td>
</tr>
<tr>
<td rowspan="3">
<p class="para-default">E</p>
</td>
<td>
<p class="para-default">(1) Trailer supply</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(2) Parking circuit control</p>
</td>
</tr>
<tr>
<td>
<p class="para-default">(3) Front circuit control</p>
</td>
</tr>
<tr>
<td rowspan="1">
<p class="para-default">F</p>
</td>
<td>
<p class="para-default">(1) Auxiliaries supply</p>
</td>
</tr>
<tr>
<td rowspan="1">
<p class="para-default">G</p>
</td>
<td>
<p class="para-default">(1) Air suspension supply</p>
</td>
</tr>
</tbody>
</table>
具有 morerows 属性的预期数据表,以便行跨度工作
<table>
<tgroup cols="2">
<colspec colname="col1"></colspec>
<colspec colname="col2"></colspec>
<tbody>
<row>
<entry morerows="5">A</entry>
<entry>(2) Front circuit supply</entry>
</row>
<row>
<entry>(3) Rear circuit supply</entry>
</row>
<row>
<entry>(4) Rear circuit control</entry>
</row>
<row>
<entry>(5) Parking circuit supply</entry>
</row>
<row>
<entry>(6) Parking circuit control</entry>
</row>
<row>
<entry>(7) Front circuit delivery</entry>
</row>
<row>
<entry morerows="5">B</entry>
<entry>(2) Rear circuit supply</entry>
</row>
<row>
<entry>(3) Front circuit delivery</entry>
</row>
<row>
<entry>(4) Rear circuit control</entry>
</row>
<row>
<entry>(5) Parking circuit delivery</entry>
</row>
<row>
<entry>(6) Parking circuit control</entry>
</row>
<row>
<entry>(7) Load sensing valve supply</entry>
</row>
<row>
<entry morerows="1">C</entry>
<entry>(1) Air supply</entry>
</row>
<row>
<entry>(2) Air compressor governor signal</entry>
</row>
<row>
<entry>D</entry>
<entry>(2) Front parking circuit delivery</entry>
</row>
<row>
<entry morerows="2">E</entry>
<entry>(1) Trailer supply</entry>
</row>
<row>
<entry>(2) Parking circuit control</entry>
</row>
<row>
<entry>(3) Front circuit control</entry>
</row>
<row>
<entry>F</entry>
<entry>(1) Auxiliaries supply</entry>
</row>
<row>
<entry>G</entry>
<entry>(1) Air suspension supply</entry>
</row>
</tbody>
</tgroup>
</table>
下面是我试过的xslt
<xsl:if
test="descendant::xhtml:table[@class = 'gripstable-LT-LineColor width-percent grid-all']">
<table>
<tgroup cols="2">
<colspec colname="col1"/>
<colspec colname="col2"/>
<xsl:if test="xhtml:div/xhtml:div/xhtml:div/xhtml:table/xhtml:thead">
<thead>
<xsl:for-each
select="xhtml:div/xhtml:div/xhtml:div/xhtml:table/xhtml:thead/xhtml:tr">
<row>
<xsl:if test="xhtml:td[fn:position() = 1]">
<entry>
<xsl:value-of
select="xhtml:td[fn:position() = 1]//xhtml:p[@class = 'para-default']"
/>
</entry>
</xsl:if>
<xsl:if test="xhtml:td[fn:position() = 2]">
<entry>
<xsl:value-of
select="xhtml:td[fn:position() = 2]//xhtml:p[@class = 'para-default']"
/>
</entry>
</xsl:if>
<xsl:if test="xhtml:td[fn:position() = 3]">
<entry>
<xsl:value-of
select="xhtml:td[fn:position() = 3]//xhtml:p[@class = 'para-default']"
/>
</entry>
</xsl:if>
</row>
</xsl:for-each>
</thead>
</xsl:if>
<tbody>
<xsl:for-each
select="xhtml:div/xhtml:div/xhtml:div/xhtml:table/xhtml:tbody/xhtml:tr">
<row>
<entry>
<xsl:value-of
select="xhtml:td[fn:position() = 1]/xhtml:p[@class = 'para-default']"
/>
</entry>
<entry>
<xsl:value-of
select="xhtml:td[fn:position() = 2]/xhtml:p[@class = 'para-default']"
/>
</entry>
<!-- <xsl:if test="xhtml:td[1]/@rowspan">
<entry>
<xsl:attribute name="morerows">
<xsl:value-of select="xhtml:td[fn:position() = 1]/@rowspan"/>
</xsl:attribute>
<xsl:value-of select="xhtml:td[fn:position() = 1]/xhtml:p[@class = 'para-default']"/>
</entry>
</xsl:if>
<xsl:if test="xhtml:td[2]">
<entry>
<xsl:value-of select="xhtml:td[fn:position() = 2]/xhtml:p[@class = 'para-default']"/>
</entry>
</xsl:if> -->
</row>
</xsl:for-each>
</tbody>
</tgroup>
</table>
</xsl:if>
看来你可以编写模板来匹配和转换不同的 HTML 元素和属性到 target/dita 对应物:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="table">
<xsl:copy>
<xsl:apply-templates select="colgroup"/>
</xsl:copy>
</xsl:template>
<xsl:template match="colgroup">
<tgroup cols="{count(col)}">
<xsl:apply-templates select="col, ../tbody"/>
</tgroup>
</xsl:template>
<xsl:template match="col">
<colspec colname="col{position()}"/>
</xsl:template>
<xsl:template match="tbody">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="tr">
<row>
<xsl:apply-templates/>
</row>
</xsl:template>
<xsl:template match="th | td">
<entry>
<xsl:apply-templates select="@*, node()"/>
</entry>
</xsl:template>
<xsl:template match="th/@* | td/@*"/>
<xsl:template match="th/@rowspan[. > 1] | td/@rowspan[. > 1]">
<xsl:attribute name="morerows" select=". - 1"/>
</xsl:template>
</xsl:stylesheet>
然而,一般来说,对于复杂但定义明确且得到广泛支持的词汇表,如 XHTML 和 Dita,我会查看是否有现有的库来实现手头的任务,而不是尝试自己动手。