0

CALS モデルを使用してマークアップされた多数の XML テーブルがあり、そのうちのいくつかには削除したい空の列があります。したがって、ここにマークアップの例があります

              <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>

したがって、完全に削除したいのは、上記の例の列 4 です。多くの場合 (ほとんどの場合?)、最後の列になりますが、常にそうであるとは限りません。

そして、列 4 にはスペース、または 160; が含まれていることに注意してください。文字。

では、 xslt を使用してそのような列全体を削除するにはどうすればよいでしょうか?

ティア

ファーガル

4

1 に答える 1

1

これを試してください:

<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)"/>

  <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', position())[normalize-space(.)])]" />
</xsl:stylesheet>

空白の列を削除するだけでなく、保持されている列の再​​番号付けも処理します (これが必要だと思います)。この入力では、2 番目の列が空白です。

<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> </entry>
        <entry>No. 9</entry>
        <entry>No. 10</entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry>Max. size:</entry>
        <entry> </entry>
        <entry>10.5 m.</entry>
        <entry>6.7 m.</entry>
      </row>
      <row>
        <entry>Length:</entry>
        <entry> </entry>
        <entry>210 m.</entry>
        <entry>100 m.</entry>
      </row>
      <row>
        <entry>Depth:</entry>
        <entry> </entry>
        <entry>11.0</entry>
        <entry>7.0</entry>
      </row>
    </tbody>
  </tgroup>
</table>

結果は次のとおりです。

<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" />
    <thead>
      <row valign="bottom">
        <entry> </entry>
        <entry>No. 9</entry>
        <entry>No. 10</entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry>Max. size:</entry>
        <entry>10.5 m.</entry>
        <entry>6.7 m.</entry>
      </row>
      <row>
        <entry>Length:</entry>
        <entry>210 m.</entry>
        <entry>100 m.</entry>
      </row>
      <row>
        <entry>Depth:</entry>
        <entry>11.0</entry>
        <entry>7.0</entry>
      </row>
    </tbody>
  </tgroup>
</table>
于 2013-02-07T17:34:58.307 に答える