Как удалить пустой столбец в таблице HTML с помощью XSLT? - PullRequest
2 голосов
/ 16 апреля 2010

Как удалить пустой столбец в таблице HTML с помощью XSLT и получить что-то вроде этого:


 <table id="cas6">
    <tr>
      <td />
      <td>
        <table>
          <tr>
            <td>rechin</td>
            <td />
          </tr>
          <tr>
            <td>amarillo</td>
            <td />
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <table id="cas7">
    <tr>
      <td>rechin</td>
      <td />
    </tr>
    <tr>
      <td>amarillo</td>
      <td />
    </tr>
    <tr>
      <td>this shouldn&#39;t been</td>
      <td>deleted</td>
    </tr>
  </table>

Чтобы удалить пустой столбец, это означает, что удаляются тд, которые являются пустыми во всех tr в позиции Xth

Ответы [ 3 ]

1 голос
/ 16 апреля 2010

Это XSLT, который работал для меня.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*" />

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

  <xsl:template match="td[not(node())]">
    <xsl:variable name="pos" select="position()" />
    <xsl:variable name="emptyTds" select="count(../../tr/td[position() = $pos and not(node())])" />
    <xsl:variable name="allTds" select="count(../../tr/td[position() = $pos])" />
    <xsl:if test="$emptyTds != $allTds">
      <xsl:copy>
        <xsl:value-of select="."/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

1 голос
/ 16 апреля 2010

Вот очень простое решение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="td[not(node())]">
  <xsl:variable name="vPos" select="position()"/>

  <xsl:if test="../../tr/td[position() = $vPos]/node()">
    <xsl:copy-of select="."/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML (сделан правильно):

<html>
    <table border="1" id="cas6">
        <tr>
            <td/>
            <td>
                <table border="1">
                    <tr>
                        <td>rechin</td>
                        <td />
                    </tr>
                    <tr>
                        <td>amarillo</td>
                        <td />
                    </tr>
                </table></td>
        </tr>
    </table>
    <table border="1" id="cas7">
        <tr>
            <td>rechin</td>
            <td />
        </tr>
        <tr>
            <td>amarillo</td>
            <td />
        </tr>
        <tr>
            <td>this shouldn't been</td>
            <td>deleted</td>
        </tr>
    </table>
</html>

Требуется правильный результат :

<html>
    <table border="1" id="cas6">
        <tr>
            <td>
                <table border="1">
                    <tr>
                        <td>rechin</td>
                    </tr>
                    <tr>
                        <td>amarillo</td>
                    </tr>
                </table></td>
        </tr>
    </table>
    <table border="1" id="cas7">
        <tr>
            <td>rechin</td>
            <td></td>
        </tr>
        <tr>
            <td>amarillo</td>
            <td></td>
        </tr>
        <tr>
            <td>this shouldn't been</td>
            <td>deleted</td>
        </tr>
    </table>
</html>
0 голосов
/ 16 апреля 2010

Если мое понимание вопроса верно, для данной таблицы, если все записи в столбце nth пусты, вы хотите удалить этот столбец из таблицы?

Попробуйте XSLT, затем

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="td">
      <xsl:variable name="columnNumber" select="position()"/>
      <xsl:if test="../../tr/td[position()=$columnNumber][* or text()]">
         <xsl:copy>
            <xsl:value-of select="$columnNumber"/>
            <xsl:apply-templates select="@*|node()"/>
         </xsl:copy>
      </xsl:if>
   </xsl:template>
   <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

Это преобразование 'identity', но когда оно соответствует элементу TD, оно сначала получает номер столбца, а затем проверяет, являются ли какие-либо другие столбцы в других строках пустыми. Если он находит непустые ячейки в том же столбце, он копирует элемент TD, в противном случае он игнорируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...