我有下面的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计数将减少
如果表中有额外的列或行,我就必须将其作为错误抛出。
1条答案
按热度按时间idfiyjo81#
这是一个坚韧的问题,您必须非常仔细地考虑边缘情况,例如,colspan=“2”的单元格与上一行中rowspan=“2”的单元格部分重叠。除了具有额外的行或列之外,可能还有许多错误,我假设您也希望捕获这些错误。
可能有更快的解决方案,但我认为最简单的方法是先创建一个临时数据结构,该结构的形式为
对于遇到的每个“真实的”(1乘1)单元有一个条目,然后在第二遍中检查该数据结构的差异,例如没有重复(重叠单元)和没有参差不齐(所有行的最大列必须相同,所有列的最大行必须相同)。
您需要使用递归处理输入中的行和列,或者如果您可以使用
xsl:iterate
来使用XSLT 3.0,那么您可以跟踪当前的行号和列号。那么
td
的处理就相当简单了:你就这么做希望这张草图能给予你一些启发。