我正在使用表条目元素,并希望在同一个表中获取通过以下测试的所有前面的条目元素:
parent::row/preceding-sibling::row/entry
[@morerows >= count(parent::row/following-sibling::row
[not(preceding-sibling::row/entry
[generate-id() = $id])])]
[count(preceding-sibling::entry
[not(@morerows)]) + 1 = count(current()/preceding-sibling::entry) + 1]
XPath 给了我想要的结果,但是速度很慢......我想使用一个密钥,但是遇到了问题。
我定义了一个键如下:
<xsl:key name="moreRowsEntry" match="entry[@morerows]" use="."/>
虽然该键确实检索了具有 morerows 属性的所有条目元素,但实际上我只需要它来检索同一个祖先表中的那些元素。同样,我不知道如何测试 morerows 值。我尝试过诸如:
<xsl:for-each select="key('moreRowsEntry', (@morerows >= count(parent::row/following-sibling::row[not(preceding-sibling::row/entry[generate-id() = $id])])) and (count(preceding-sibling::entry[not(@morerows)]) + 1 = count(current()/preceding-sibling::entry) + 1))">
我必须使用 XSL 1.0 来做到这一点。任何和所有的帮助表示赞赏。
一些进一步的信息:
我正在将 CALS 表转换为 OOXML。对于我知道缺少单元格的行中的 CALS 表中的每个条目,我需要添加这些额外的单元格。对于这些条目元素,我有一个元素$id
的 generate-id() 值。
然后我有上面的 XPath,它测试表 ( parent::row/preceding-sibling::row/entry
) 的前面行中的任何条目元素,其 morerows 属性大于或等于其自身与 id 的条目之间的行数$id
,并且位于应插入空单元格的正确位置 ( count(preceding-sibling::entry[not(@morerows)]) + 1 = count(current()/preceding-sibling::entry) + 1
)
简化样本输入:
<table>
<tbody>
<row>
<entry morerows="2">A</entry>
<entry morerows="1">B</entry>
<entry>C</entry>
<entry>D</entry>
</row>
<row>
<entry>E</entry>
<entry>F</entry>
</row>
<row>
<entry>G</entry>
<entry>H</entry>
<entry>I</entry>
</row>
<row>
<entry>J</entry>
<entry>K</entry>
<entry>L</entry>
<entry>M</entry>
</row>
</tbody>
</table>
简化样本输出:
<w:tbl>
<w:tr>
<w:tc>
<w:p>
<w:r>
<w:t>A</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>B</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>C</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>D</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>E</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>F</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>G</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>H</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>I</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:p>
<w:r>
<w:t>J</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>K</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>L</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>M</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
输入使用 morerows 属性来指定跨行。输出要求将实际单元格与<w:vMerge/>
每个跨单元格的元素一起插入。
另一个样本:
在此示例中,还必须考虑合并列(由 namest 和 nameend 属性指定):
<table>
<tgroup cols="7">
<colspec colname="col1"/>
<colspec colname="col2"/>
<colspec colname="col3"/>
<colspec colname="col4"/>
<colspec colname="col5"/>
<colspec colname="col6"/>
<colspec colname="col7"/>
<tbody>
<row>
<entry morerows="5">A</entry>
<entry morerows="1">B</entry>
<entry morerows="1">C</entry>
<entry>D</entry>
<entry>E</entry>
<entry>F</entry>
<entry>G</entry>
</row>
<row>
<entry>2D</entry>
<entry>2E</entry>
<entry>2F</entry>
<entry>2G</entry>
</row>
<row>
<entry morerows="1">3B</entry>
<entry morerows="1">3C</entry>
<entry>3D</entry>
<entry>3E</entry>
<entry>3F</entry>
<entry>3G</entry>
</row>
<row>
<entry>4D</entry>
<entry>4E</entry>
<entry>4F</entry>
<entry>4G</entry>
</row>
<row>
<entry morerows="1" nameend="col6" namest="col2">3G - 4G</entry>
<entry morerows="1">5G</entry>
</row>
</tbody>
</tgroup>
</table>
输出:
<w:tbl>
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge w:val="restart"/>
</w:tcPr>
<w:p>
<w:r>
<w:t>A</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge w:val="restart"/>
</w:tcPr>
<w:p>
<w:r>
<w:t>B</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge w:val="restart"/>
</w:tcPr>
<w:p>
<w:r>
<w:t>C</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>D</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>E</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>F</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>G</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>2D</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>2E</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>2F</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>2G</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge w:val="restart"/>
</w:tcPr>
<w:p>
<w:r>
<w:t>3B</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge w:val="restart"/>
</w:tcPr>
<w:p>
<w:r>
<w:t>3C</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>3D</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>3E</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>3F</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>3G</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>4D</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>4E</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>4F</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>4G</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:tcPr>
<w:vMerge/>
</w:tcPr>
<w:p/>
</w:tc>
<w:tc>
<w:tcPr>
<w:gridSpan w:val="5"/>
</w:tcPr>
<w:p>
<w:r>
<w:t>3G - 4G</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>5G</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>