从CALS剥离空列

时间:2016-04-12 15:08:50

标签: xslt

我在这里回答过类似的问题 Strip empty columns from calstable model

基本上同样的问题,稍微复杂一点: 我有一堆跨多个XML文件的CALS模型表。其中一些具有空的最终列,例如在此示例中

         <table frame="none">
            <tgroup cols="4" colsep="0" rowsep="0">
               <colspec colname="1" colnum="1" colwidth="75pt"/>
               <colspec colname="2" colnum="2" colwidth="63pt" align="center"/>
               <colspec colname="3" colnum="3" colwidth="63pt" align="center"/>
               <colspec colname="4" colnum="4" colwidth="63pt"/>
               <thead>
                  <row valign="bottom">
                     <entry> </entry>
                     <entry>No. 9</entry>
                     <entry>No. 10</entry>
                     <entry> </entry>
                  </row>
               </thead>
               <tbody>
                  <row>
                     <entry>Max. size:</entry>
                     <entry>10.5 m.</entry>
                     <entry>6.7 m.</entry>
                     <entry> </entry>
                  </row>
                  <row>
                     <entry>Length:</entry>
                     <entry>210 m.</entry>
                     <entry>100 m.</entry>
                     <entry> </entry>
                  </row>
                  <row>
                     <entry>Depth:</entry>
                     <entry>11.0</entry>
                     <entry>7.0</entry>
                     <entry> </entry>
                  </row>
               </tbody>
            </tgroup>
         </table>

我想删除最后一个空列。其他帖子的答案解决了许多例子。但是,如果表格在其结构中使用了合并单元格,那么它就不起作用了。

跨骑行将被编码为

                  <row>
                     <entry namest="1" nameend="3">Notes: This table is short</entry>
                     <entry> </entry>
                  </row>

我需要对其他解决方案进行哪些调整才能考虑跨行?

TIA

1 个答案:

答案 0 :(得分:0)

我已从JLRishe

修改了样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- This key will allow us to select all the entries in a column based on their
       column  number -->
    <xsl:key name="kColumn" match="entry"
        use="count(. | preceding-sibling::entry[not(@namest)]) 
        + count(preceding-sibling::entry[@namest])
        + sum(preceding-sibling::entry/@nameend)
        - sum(preceding-sibling::entry/@namest)"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="tgroup">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <!-- Select colspecs whose column isn't all blank -->
            <xsl:apply-templates 
                select="colspec[key('kColumn', position())[normalize-space(.)]]" />
            <xsl:apply-templates select="node()[not(self::colspec)]" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="colspec">
        <colspec colname="{position()}" colnum="{position()}">
            <xsl:apply-templates 
                select="@*[local-name() != 'colname' and local-name() != 'colnum']" />
            <xsl:apply-templates select="node()" />
        </colspec>
    </xsl:template>

    <!-- Omit entries that belong to all-blank columns -->
    <xsl:template match="entry[not(key('kColumn', count(. | preceding-sibling::entry[not(@namest)]) 
        + count(preceding-sibling::entry[@namest])
        + sum(preceding-sibling::entry/@nameend)
        - sum(preceding-sibling::entry/@namest))[normalize-space(.)])]" />
</xsl:stylesheet>

我已经使用@namest@nameend完成了几项测试。如果@morerows存在,我不确定此代码是否有效。