rowspanの数がいくつでも対応できるXSLTを構築したい
Office Open XMLで作成した表組(下記)をHTMLの表組に変換するXSLTを作成しています。
セルが縦方向にいくつ結合されていても対応できるXSLTを作成したいのですが、while文の様な「条件不一致でループを抜けて、そのときのカウンタの値を使用する」という処理が構築できません。
以下が、対象のXMLソースです。
※Githubへの登録が不可でしたので、ソースの整形状態を画像で、スペース無しのソースを画像の末尾に貼付しました。(文字数制限?で送信不可なため)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body><w:tbl><w:tr><!-- 1行目 --><w:tc><w:tcPr/><w:p><w:r><w:t>(1行1列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge w:val="restart"/></w:tcPr><w:p><w:r><w:t>(1行2列目)</w:t></w:r></w:p><w:p><w:r><w:t>(2行2列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge w:val="restart"/></w:tcPr><w:p><w:r><w:t>(1行3列目)</w:t></w:r></w:p><w:p><w:r><w:t>(2行3列目)</w:t></w:r></w:p><w:p><w:r><w:t>(3行3列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge w:val="restart"/></w:tcPr><w:p><w:r><w:t>(1行4列目)</w:t></w:r></w:p><w:p><w:r><w:t>(2行4列目)</w:t></w:r></w:p><w:p><w:r><w:t>(3行4列目)</w:t></w:r></w:p><w:p><w:r><w:t>(4行4列目)</w:t></w:r></w:p></w:tc></w:tr><w:tr><!-- 2行目 --><w:tc><w:tcPr/><w:p><w:r><w:t>(2行1列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc></w:tr><w:tr><!-- 3行目 --><w:tc><w:tcPr/><w:p><w:r><w:t>(3行1列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr/><w:p><w:r><w:t>(3行2列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc></w:tr><w:tr><!-- 4行目 --><w:tc><w:tcPr/><w:p><w:r><w:t>(4行1列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr/><w:p><w:r><w:t>(4行2列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr/><w:p><w:r><w:t>(4行3列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc></w:tr><w:tr><!-- 5行目 --><w:tc><w:tcPr><w:vMerge w:val="restart"/></w:tcPr><w:p><w:r><w:t>(5行1列目)</w:t></w:r></w:p><w:p><w:r><w:t>(6行1列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge w:val="restart"/></w:tcPr><w:p><w:r><w:t>(5行2列目)</w:t></w:r></w:p><w:p><w:r><w:t>(6行2列目)</w:t></w:r></w:p><w:p><w:r><w:t>(7行2列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge w:val="restart"/></w:tcPr><w:p><w:r><w:t>(5行3列目)</w:t></w:r></w:p><w:p><w:r><w:t>(6行3列目)</w:t></w:r></w:p><w:p><w:r><w:t>(7行3列目)</w:t></w:r></w:p><w:p><w:r><w:t>(8行3列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge w:val="restart"/></w:tcPr><w:p><w:r><w:t>(5行4列目)</w:t></w:r></w:p><w:p><w:r><w:t>(6行4列目)</w:t></w:r></w:p><w:p><w:r><w:t>(7行4列目)</w:t></w:r></w:p><w:p><w:r><w:t>(8行4列目)</w:t></w:r></w:p><w:p><w:r><w:t>(9行4列目)</w:t></w:r></w:p></w:tc></w:tr><w:tr><!-- 6行目 --><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc></w:tr><w:tr><!-- 7行目 --><w:tc><w:tcPr/><w:p><w:r><w:t>(7行1列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc></w:tr><w:tr><!-- 8行目 --><w:tc><w:tcPr/><w:p><w:r><w:t>(8行1列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr/><w:p><w:r><w:t>(8行2列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc></w:tr><w:tr><!-- 9行目 --><w:tc><w:tcPr/><w:p><w:r><w:t>(9行1列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr/><w:p><w:r><w:t>(9行2列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr/><w:p><w:r><w:t>(9行3列目)</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:vMerge/></w:tcPr><w:p/></w:tc></w:tr></w:tbl></w:body></w:document>
セルの結合がない場合、<w:tcPr>要素は空となります。
結合したセルの最初(一番上)に相当する<w:tc>の<w:tcPr>要素には以下の内容が書き込まれます。
<w:tcPr> <w:vMerge w:val="restart"/> </w:tcPr>
結合したセルの二番目以降に相当する<w:tc>の<w:tcPr>要素には以下の内容が書き込まれます。
<w:tcPr> <w:vMerge/> </w:tcPr>
作成したXSLT
作成したXSLTは以下のとおりです。
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" version="2.0"><xsl:output method="html" encoding="UTF-8" indent="yes" name="html_format"/><xsl:strip-space elements="*"/><xsl:template match="/"><xsl:apply-templates/></xsl:template><xsl:template match="w:document"><xsl:apply-templates/></xsl:template><xsl:template match="w:body"><html><body><xsl:apply-templates/></body></html></xsl:template><xsl:template match="w:tbl"><table border="1" style="border-collapse: collapse"><xsl:apply-templates/></table></xsl:template><xsl:template match="w:tr"><tr><xsl:apply-templates select="element()"/></tr></xsl:template><xsl:template match="w:tc"><xsl:variable name="tr_position" select="count(../preceding-sibling::w:tr)+1"/><xsl:variable name="tc_position" select="position()"/><xsl:variable name="current_tc_vMerge_val" select="descendant::w:vMerge/@w:val"/><xsl:variable name="next_tc_vMerge_val" select="../following-sibling::w:tr[position()=$tr_position+1]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge/@w:val"/><xsl:choose><xsl:when test="count(./w:tcPr/w:vMerge)=0"><td><xsl:apply-templates/></td></xsl:when><xsl:when test="(count(./w:tcPr/w:vMerge)=1) and ($current_tc_vMerge_val='restart')"><xsl:variable name="target_vMerge2" select="../following-sibling::w:tr[position()=2]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge//@w:val"/><xsl:variable name="target_vMerge3" select="../following-sibling::w:tr[position()=3]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge//@w:val"/><xsl:variable name="target_vMerge4" select="../following-sibling::w:tr[position()=4]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge//@w:val"/><xsl:variable name="target_vMerge5" select="../following-sibling::w:tr[position()=5]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge//@w:val"/><td><xsl:attribute name="rowspan"><xsl:choose> <!-- 以下は、rowspn上限=5迄にしか対応しない --><xsl:when test="(count(../following-sibling::w:tr[position()=2]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge)=0) or ($target_vMerge2='restart')"><xsl:value-of select="2"/></xsl:when><xsl:when test="(count(../following-sibling::w:tr[position()=3]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge)=0) or ($target_vMerge3='restart')"><xsl:value-of select="3"/></xsl:when><xsl:when test="(count(../following-sibling::w:tr[position()=4]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge)=0) or ($target_vMerge4='restart')"><xsl:value-of select="4"/></xsl:when><xsl:when test="(count(../following-sibling::w:tr[position()=5]/w:tc[position()=$tc_position]/w:tcPr/w:vMerge)=0) or ($target_vMerge5='restart')"><xsl:value-of select="5"/></xsl:when></xsl:choose></xsl:attribute><xsl:apply-templates/></td></xsl:when></xsl:choose></xsl:template><xsl:template match="w:p"><p><xsl:apply-templates/></p></xsl:template><xsl:template match="w:r"><xsl:apply-templates/></xsl:template><xsl:template match="w:t"><xsl:value-of select="."/></xsl:template></xsl:stylesheet>
以下〈xsl:template match="w:tc"〉内のchoose文を結合数無制限に対応する条件文に変更したいです。
xsl:for-eachで考えてみたのですが、都合の良い抜け方が分かりませんでした。
(現在は、結合=5つまで対応)
以上、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/28 04:01