需要将 xhtml 表转换为具有行跨度的 dita 特定表

问题描述 投票:0回答:1

需要将 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>
xslt-2.0 xslt-3.0
1个回答
1
投票

看来你可以编写模板来匹配和转换不同的 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,我会查看是否有现有的库来实现手头的任务,而不是尝试自己动手。

© www.soinside.com 2019 - 2024. All rights reserved.