1

私は似たようなXMLを持っています

<BOXHEAD>
  <COLHEAD H="1">Item</COLHEAD>
  <COLHEAD H="2">Cost</COLHEAD>
  <COLHEAD H="3">Direct</COLHEAD>
  <COLHEAD H="3">In-Direct</COLHEAD>
  <COLHEAD H="2">Revenue</COLHEAD>
  <COLHEAD H="3">1989</COLHEAD>
  <COLHEAD H="3">1990</COLHEAD>
</BOXHEAD>

HTML COLSPANに変換するために、これに似たものを試しました。

<xsl:if test="@H=2">
    <xsl:variable name="descendants" select="following-sibling::COLHEAD[@H = 3]"/>
    <xsl:variable name="number_of_columns_under_this" select="count($descendants)"/>
    <xsl:if test="$number_of_columns_under_this &gt; 1">
        <xsl:attribute name="colspan">
            <xsl:value-of select="$number_of_columns_under_this"/>
        </xsl:attribute>
    </xsl:if>
</xsl:if>

望ましい結果:「コスト」列が表示されるはずですcolspan="2"が、もちろん、ブロック内のcount()4つすべてを取得します。@H="3"私はその古代のSGMLをHTMLテーブルに変えようとしています。必要な出力は次のようになります。

<table>
<tbody>
<tr>
    <td colspan="1" rowspan="2">Item</td>
    <td colspan="2" rowspan="1">Cost</td>
    <td colspan="2" rowspan="1">Revenue</td>
</tr>
<tr>
    <td>Direct</td>
    <td>In-Direct</td>
    <td>1989</td>
    <td>1990</td>
</tr>
</tbody>
</table>

行スパンと列スパンを計算することは私にとって難しいことを証明しています。

4

2 に答える 2

3

あなたはこのようなトリックを使うことができます

<xsl:variable name="descendants"
    select="following-sibling::COLHEAD[@H = 3]
       [generate-id((preceding-sibling::COLHEAD[@H=2])[last()])
         = generate-id(current())]"/>

これにより、最も近い先行兄弟が現在調べているCOLHEAD[@H=3]要素であるすべての要素が選択されます。@H=2

于 2013-03-01T12:17:59.903 に答える
2

XSLT 2.0を使用している場合は、おそらくこれに位置グループ化を使用する必要があります<xsl:for-each-group group-starting-with="[@H='2']>。しかし、必要な出力を正確に知らなければ、詳細を提供することは困難です。

于 2013-03-01T14:04:05.917 に答える