2013-10-31 5 views
6

私はXSLT(v1.0)が新しく、XSLTを使って複雑なXHTMLテーブルをLaTeXに変換することはできません。XSLTを使ってXHTMLテーブルをLaTeXに変換する

私が複雑なテーブルを言ったのは、異なる数の列を持つテーブルのことです。つまり、tdcolspanがあります。

すなわち(XHTMLテーブル)

<table border="1" cellspacing="0" cellpadding="0"> 
    <tr> 
     <td valign="top" width="68" colspan="3"> <p>Values</p> </td> 
    </tr> 
    <tr> 
     <td valign="top" width="68"> <p>95</p> </td> 
     <td valign="top" width="68"> <p>169</p> <p> </p> </td> 
     <td valign="top" width="68"> <p>180</p> <p> </p> </td> 
    </tr> 
</table> 

私はXSLファイルでやってる何がある:

<xsl:template match="xhtml:table[@border='1']"> 
    <xsl:text>\begin{center}</xsl:text> 
    <xsl:text>\begin{tabular}{</xsl:text> 

    <xsl:for-each select="xhtml:tr[1]/*"> 
     <xsl:text>c</xsl:text> 
     <xsl:if test="position() = last()"> 
      <xsl:text>}&#10;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 

    <xsl:text>\toprule&#10;</xsl:text> 
    <xsl:for-each select="xhtml:tr"> 
     <xsl:if test="position() != 1"> 
      <xsl:text>\midrule&#10;</xsl:text> 
     </xsl:if> 

     <xsl:if test="position() = 2"> 
      <xsl:text>\midrule&#10;</xsl:text> 
     </xsl:if> 

     <xsl:for-each select="xhtml:td|xhtml:th"> 
      <xsl:if test="name() = 'th'">{\bf </xsl:if> 
      <xsl:apply-templates /> 
      <xsl:if test="name() = 'th'">}</xsl:if> 

      <xsl:if test="position() != last()"> 
      <xsl:text>&amp;</xsl:text> 
      </xsl:if> 
     </xsl:for-each> 

     <xsl:text> \\&#10;</xsl:text> 
    </xsl:for-each> 

    <xsl:text>\bottomrule&#10;</xsl:text> 

    <xsl:text>\end{tabular}&#10;</xsl:text> 
    <xsl:text>\end{center}&#10;</xsl:text> 
</xsl:template> 

しかし、あなたが見ることができるように、このコードは欠かせ、簡単な表のために働きますcolspan属性。コードは最初のtrの周りをループし、tdのそれぞれについて、 "c"を書き込みます。したがって、上記の場合、1つの列テーブルのみが作成されます。

tdの数と、存在する場合はcolspansの数を数え、3列の正しい表を作成します。

これを行う方法を知っている人はいますか?前もって感謝します。

+1

:-) 1993年に廃止されました(これは非常にアクティブなXSLTタグを持っています)それはTeXの質問ではありません –

答えて

6

これはXSLT2では簡単ですが、XSLT 1の(//*)[position() &lt;= n]イディオムを使用してn回反復することができます。私も少しはあなたのTeXを固定:LaTeX2eの背中に発売以来\bfこれはstackoverflowの上で聞かれるべき


<table xmlns="http://www.w3.org/1999/xhtml" 
    border="1" cellspacing="0" cellpadding="0"> 
    <tr> 
     <td valign="top" width="68" colspan="3"> <p>Values</p> </td> 
    </tr> 
    <tr> 
     <td valign="top" width="68"> <p>95</p> </td> 
     <td valign="top" width="68"> <p>169</p> <p> </p> </td> 
     <td valign="top" width="68"> <p>180</p> <p> </p> </td> 
    </tr> 
</table> 

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xhtml="http://www.w3.org/1999/xhtml"> 

<xsl:output method="text"/> 

<xsl:template match="xhtml:table[@border='1']"> 
<xsl:text>\begin{center}&#10;</xsl:text> 
<xsl:text>\begin{tabular}{</xsl:text> 

<xsl:for-each select="xhtml:tr[1]/*"> 
    <xsl:choose> 
    <xsl:when test="@colspan"> 
    <xsl:for-each select="(//*)[position()&lt;=current()/@colspan]">c</xsl:for-each> 
    </xsl:when> 
    <xsl:otherwise>c</xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 
<xsl:text>}&#10;</xsl:text> 

<xsl:text>\toprule&#10;</xsl:text> 
<xsl:for-each select="xhtml:tr"> 
    <xsl:if test="position() != 1"> 
    <xsl:text>\midrule&#10;</xsl:text> 
    </xsl:if> 

    <xsl:if test="position() = 2"> 
    <xsl:text>\midrule&#10;</xsl:text> 
    </xsl:if> 

    <xsl:for-each select="xhtml:td|xhtml:th"> 
    <xsl:if test="self::xhtml:th">\bfseries </xsl:if> 
    <xsl:apply-templates /> 
    <xsl:if test="position() != last()"> 
    <xsl:text>&amp;</xsl:text> 
    </xsl:if> 
    </xsl:for-each> 

    <xsl:if test="position()!=last()"> \\&#10;</xsl:if> 
</xsl:for-each> 

<xsl:text>\end{tabular}&#10;</xsl:text> 
<xsl:text>\end{center}</xsl:text> 

</xsl:template> 
</xsl:stylesheet> 

\begin{center} 
\begin{tabular}{ccc} 
\toprule 
Values \\ 
\midrule 
\midrule 
95 & 169 & 180 \end{tabular} 
\end{center} 
+0

ありがとうございます!私はそれを数日間修正しようとしていました。 – Wagner

関連する問題