XSLT を使用して、列に「0.00」または「-」しか含まれていない場合、表の列全体 (ヘッダーと本文のセル) を削除する必要があります。
つまり、1 つ以上の列のセルのすべての値が 0.00/- の場合、列全体を削除する必要があります。
XSLT を使用して、列に「0.00」または「-」しか含まれていない場合、表の列全体 (ヘッダーと本文のセル) を削除する必要があります。
つまり、1 つ以上の列のセルのすべての値が 0.00/- の場合、列全体を削除する必要があります。
列のすべてのデータ セルが 0.00/- である場合、それらの 1 つだけではなく、それを削除するつもりはないと仮定しました。誤解がある場合はお知らせください。それに応じてソリューションのスタイルシートを更新します。
テーブルを作成するにはさまざまな方法とオプションがあるため、テーブルのタイプと構造に合わせてソリューションを調整する必要があります。ここに示されているのは、単純な形式のテーブルのソリューションです。
この XSLT 1.0 スタイルシート...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template name="ident" match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="td">
<xsl:variable name="col" select="count(preceding-sibling::td)+1" />
<xsl:if test="../../tr/td[$col][. != '0.00'][. != '-']">
<xsl:call-template name="ident" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
...この入力ドキュメントに適用すると...
<table>
<th>
<td>Contestant</td><td>Score</td><td>Country</td>
</th>
<tr>
<td>Jack</td><td>0.00</td><td>AUS</td>
</tr>
<tr>
<td>Jill</td><td>-</td><td>-</td>
</tr>
</table>
...譲ります...
<table>
<th>
<td>Contestant</td>
<td>Country</td>
</th>
<tr>
<td>Jack</td>
<td>AUS</td>
</tr>
<tr>
<td>Jill</td>
<td>-</td>
</tr>
</table>
ヘッダー以外のすべての「空の」セルを含む 1 つの列のみが削除されます。
そして、これが XSLT 2.0 に相当するものです...
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" 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(
for $c in count(preceding-sibling::td)+1 return
../../tr/td[$c][.!='0.00'][.!= '-'] )]" />
</xsl:stylesheet>
I. 同様ですが、より効率的な (O(N)) XSLT 1.0 ソリューション(Sean の XSLT 1.0 ソリューションは O(N^2) で、N は列の数です):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vrtfColProps">
<xsl:for-each select="/*/tr[1]/td">
<xsl:variable name="vPos" select="position()"/>
<col pos="{$vPos}">
<xsl:if test="/*/tr/td[$vPos][not(. = 0.00 or . ='-')]">
1
</xsl:if>
</col>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="vColProps" select="ext:node-set($vrtfColProps)/*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="td">
<xsl:variable name="vPos" select="position()"/>
<xsl:if test="$vColProps[@pos=$vPos]/node()">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
この変換が次のドキュメントに適用されたとき:
<table border="1">
<th>
<tr>
<td>Contestant</td><td>Score</td><td>Country</td>
</tr>
</th>
<tr>
<td>Jack</td><td>0.00</td><td>AUS</td>
</tr>
<tr>
<td>Jill</td><td>-</td><td>-</td>
</tr>
</table>
必要な正しい結果が生成されます。
<table border="1">
<th>
<tr>
<td>Contestant</td>
<td>Country</td>
</tr>
</th>
<tr>
<td>Jack</td>
<td>AUS</td>
</tr>
<tr>
<td>Jill</td>
<td>-</td>
</tr>
</table>
Ⅱ.より効率的な (線形対 Sean の 2 次複雑度) XSLT 2.0 ソリューション:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vColProps">
<xsl:for-each select="/*/tr[1]/td">
<xsl:variable name="vPos" select="position()"/>
<col pos="{$vPos}">
<xsl:if test="/*/tr/td[$vPos][not(. = '0.00' or . = '-')]">
1
</xsl:if>
</col>
</xsl:for-each>
</xsl:variable>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"td[for $vPos in position()
return
not($vColProps/*[@pos=$vPos]/node())
]"/>
</xsl:stylesheet>
この変換を同じ XML ドキュメント (上記) に適用すると、同じように正しい結果が得られます。
<table border="1">
<th>
<tr>
<td>Contestant</td>
<td>Country</td>
</tr>
</th>
<tr>
<td>Jack</td>
<td>AUS</td>
</tr>
<tr>
<td>Jill</td>
<td>-</td>
</tr>
</table>