html xslt中的表行列验证

7ajki6be  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(118)

我有下面的XML(表):

<table-wrap id="tbl4" position="float">
            <label>Table E3</label>
            <caption>
                <p></p>
            </caption>
            <alternatives>
                <graphic xmlns:xlink="http://www.w3.org/1999/xlink"
                         xlink:href="EEMCS-01-2021-001110.tif"/>
                <table frame="hsides">
                    <colgroup>
                        <col align="left"/>
                        <col align="left"/>
                        <col align="left"/>
                        <col align="left"/>
                         <col align="left"/>
                         <col align="left"/>
                         <col align="left"/>
                    </colgroup>
                    <thead>
                        <tr>
                            <th rowspan="2" align="left">1</th>
                            <th colspan="4" align="center">2</th>
                            <th rowspan="2" align="center">3</th>
                        </tr>
                        <tr>
                            <th align="center">4</th>
                            <th align="center">5</th>
                            <th align="center">6</th>
                            <th align="center">7</th>
                            <th align="center">8</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>9</td>
                            <td rowspan="2">10</td>
                            <td>11</td>
                            <td>12</td>
                            <td>13</td>
                            <td>14</td>
                            <td rowspan="2">15</td>
                        </tr>
                        <tr>
                            <td>16</td>
                            <td>17</td>
                            <td>18</td>
                            <td>19</td>
                            <td>20</td>
                        </tr>
                        <tr>
                            <td>21</td>
                            <td colspan="2">22</td>
                            <td rowspan="2">23</td>
                            <td colspan="2">24</td>
                            <td>25</td>
                        </tr>
                        <tr>
                            <td>26</td>
                            <td>27</td>
                            <td>28</td>
                            <td>29</td>
                            <td>30</td>
                            <td>31</td>
                        </tr>
                        <tr>
                            <td rowspan="2">32</td>
                            <td colspan="2">33</td>
                            <td>34</td>
                            <td colspan="2">35</td>
                            <td rowspan="2">36</td>
                        </tr>
                        <tr>
                            <td>37</td>
                            <td>38</td>
                            <td>39</td>
                            <td>40</td>
                            <td>41</td>
                        </tr>
                    </tbody>
                </table>
            </alternatives>
        </table-wrap>

我想根据colspan和rowspan验证每个中缺少的tr或td。我想解释colspan和rowspan条件:
1.如果td中的colspan=“2”,则意味着合并(跨越)了两个列条目,因此该行中的td计数将减少
1.如果td中的rowspan=“2”,则表示合并(跨越)了两行条目,因此下一行的td计数将减少
如果表中有额外的列或行,我就必须将其作为错误抛出。

idfiyjo8

idfiyjo81#

这是一个坚韧的问题,您必须非常仔细地考虑边缘情况,例如,colspan=“2”的单元格与上一行中rowspan=“2”的单元格部分重叠。除了具有额外的行或列之外,可能还有许多错误,我假设您也希望捕获这些错误。
可能有更快的解决方案,但我认为最简单的方法是先创建一个临时数据结构,该结构的形式为

<cell row="1" column="1"/>
<cell row="1" column="2"/>
<cell row="1" column="3"/>

对于遇到的每个“真实的”(1乘1)单元有一个条目,然后在第二遍中检查该数据结构的差异,例如没有重复(重叠单元)和没有参差不齐(所有行的最大列必须相同,所有列的最大行必须相同)。
您需要使用递归处理输入中的行和列,或者如果您可以使用xsl:iterate来使用XSLT 3.0,那么您可以跟踪当前的行号和列号。

<xsl:iterate select="tr">
  <xsl:param name="currentRow" select="1"/>
  <xsl:iterate select="td">
     <xsl:param name="currentCol" select="1"/>
     .... (see below)
     <xsl:next-iteration>
       <xsl:with-param name="currentCol" 
             select="$currentCol + (@colspan, 1)[1]"/>
       </xsl:with-param>
     </xsl:next-iteration>
  </xsl:iterate>
  <xsl:next-iteration>
     <xsl:with-param name="currentRow" 
             select="$currentRow + 1"/>
     </xsl:with-param>
  </xsl:next-iteration>
</xsl:iterate>

那么td的处理就相当简单了:你就这么做

<xsl:for-each select="$currentRow to $currentRow + (@rowspan, 1)[1] - 1">
  <xsl:variable name="row" select="."/>
  <xsl:for-each select="$currentCol to $currentCol + (@colspan, 1)[1] - 1">
    <xsl:variable name="col" select="."/>
    <cell row="{$row}" col="{$col}"/>
  </xsl:for-each>
</xsl:for-each>

希望这张草图能给予你一些启发。

相关问题