2011-12-14 9 views
2

モバイルデバイスでページをより適切に表示するために、入力XHTMLドキュメントの変換を行う必要がある問題があります。すべての入力ドキュメントには、特定のIDを持つ多数のHTMLテーブルがあります。このようなテーブルの1つでは、セルの「colspan」属性を変更するだけでなく、その両端のセルの「colspan」属性を変更するためにセルを識別する必要があります。私は入力HTMLを変更できません。これは外部から取得されます。私はそれを変えることしかできません。XSLTを使用して特定のXHTMLセルを特定し、その属性を見つけた後で属性を変更する

変換しようとしているセルのすべての場合、「colspan = 2」属性の両方で、その左右の空白セルがあります。この中央のセルには "colspan = 4"属性があり、左のセルには "colspan = 1"属性があり、右のセルには削除されるようにする必要があります。

私はXSLTを使用していますが、これまでのところ私のドキュメントで他の多くの変換を達成するために管理されていました。テーブルの例を以下に示します。

私が持っているテーブルの例:

<html> 
<body> 
<table border="1"> 
<tr> 
    <td>row 1, cell 1</td> 
    <td>row 1, cell 2</td> 
    <td>row 1, cell 3</td> 
    <td>row 1, cell 4</td> 
    <td>row 1, cell 5</td> 
    </tr> 
    <tr> 
    <td colspan = "2">row 2, cell 1</td> 
    <td>Cell I Need</td> 
    <td colspan = "2">row 2, cell 3</td> 
    </tr> 
    <tr> 
    <td>row 3, cell 1</td> 
    <td>row 3, cell 2</td> 
    <td>row 3, cell 3</td> 
    <td>row 3, cell 4</td> 
    <td>row 3, cell 5</td> 
    </tr> 
</table> 

私が必要とする表:XSLTを使用して、このセルを識別し、変換する方法について

<table border="1"> 
<tr> 
    <td>row 1, cell 1</td> 
    <td>row 1, cell 2</td> 
    <td>row 1, cell 3</td> 
    <td>row 1, cell 4</td> 
    <td>row 1, cell 5</td> 
    </tr> 
    <tr> 
    <td colspan = "1">row 2, cell 1</td> 
    <td colspan = "4">Cell I Need</td> 
    </tr> 
    <tr> 
    <td>row 3, cell 1</td> 
    <td>row 3, cell 2</td> 
    <td>row 3, cell 3</td> 
    <td>row 3, cell 4</td> 
    <td>row 3, cell 5</td> 
    </tr> 
</table> 
</body> 
<html> 

任意の提案をいただければ幸いです。

多くのおかげで、テーブル内のセルを想定し クリスチャン

答えて

3

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="table"> 
     <xsl:copy> 
      <xsl:copy-of select="@*" /> 
      <xsl:apply-templates select="tr" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="tr"> 
     <tr> 
      <xsl:choose> 
       <xsl:when test="count(td[@colspan='2'])=2 and count(td)=3"> 
        <td colspan="1"> 
         <xsl:copy-of select="td[1]/node()" /> 
        </td> 
        <td colspan="4"> 
         <xsl:copy-of select="td[2]/node()" />     
        </td> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:copy-of select="td" /> 
       </xsl:otherwise> 
      </xsl:choose> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 
+0

きれいでシンプルな、ありがとう! – Christian

3

が空である(私はあなたのサンプルでは「行2、セル1」を想定していますが、純粋に注釈であり、実際のHTMLには表示されません。実数)を使用すると、テーブル行を1番目と3番目のセルが空で、colspanのように一致させることができます。

<xsl:template match="tr 
    [td[1][@colspan !=''][not(text())]] 
    [td[3][@colspan !=''][not(text())]] 
    [not(td[4])]"> 

これをIDトランスフォームと組み合わせて、この行に対して特別な処理を行うことができます。

<html> 
    <body> 
     <table border="1"> 
     <tr> 
      <td>row 1, cell 1</td> 
      <td>row 1, cell 2</td> 
      <td>row 1, cell 3</td> 
      <td>row 1, cell 4</td> 
      <td>row 1, cell 5</td> 
     </tr> 
     <tr> 
      <td colspan="2"></td> 
      <td>Cell I Need</td> 
      <td colspan="2"></td> 
     </tr> 
     <tr> 
      <td>row 3, cell 1</td> 
      <td>row 3, cell 2</td> 
      <td>row 3, cell 3</td> 
      <td>row 3, cell 4</td> 
      <td>row 3, cell 5</td> 
     </tr> 
     </table> 
    </body> 
</html> 

次以下の入力XMLに適用する場合にはここで完全なXSLT

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

    <xsl:template match="tr[td[1][@colspan !=''][not(text())]][td[3][@colspan !=''][not(text())]][not(td[4])]"> 
     <xsl:copy> 
     <xsl:variable name="colspan" select="sum(td/@colspan) + count(td[not(@colspan)]) - 1"/> 
     <td/> 
     <td colspan="{$colspan}"> 
      <xsl:apply-templates select="td[2]/@*|td[2]/node()"/> 
     </td> 
     </xsl:copy> 
    </xsl:template> 

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

が出力

されている
<html> 
    <body> 
     <table border="1"> 
     <tr> 
      <td>row 1, cell 1</td> 
      <td>row 1, cell 2</td> 
      <td>row 1, cell 3</td> 
      <td>row 1, cell 4</td> 
      <td>row 1, cell 5</td> 
     </tr> 
     <tr> 
      <td /> 
      <td colspan="4">Cell I Need</td> 
     </tr> 
     <tr> 
      <td>row 3, cell 1</td> 
      <td>row 3, cell 2</td> 
      <td>row 3, cell 3</td> 
      <td>row 3, cell 4</td> 
      <td>row 3, cell 5</td> 
     </tr> 
     </table> 
    </body> 
</html> 

私はあなたが5個の以上の細胞を持っている必要があり、いくつかの柔軟性を可能にしているノートcolspan他の場合は2となります。

colspan = "1"が表示されている必要はありません。これを出力に含めるという特定の要件がある場合は、明らかに難しいことではありません。非常に簡単な方法で

+0

は、私は、より正確にありがとうを必要としている場合は、確かに、このメソッドを使用しますが、徹底した深さでのアプローチを高く評価しています。 – Christian

関連する問題