XML table to LaTeX

后端 未结 1 785
悲&欢浪女
悲&欢浪女 2021-01-19 02:36

Suppose I have an XML table of the form


  &         
相关标签:
1条回答
  • 2021-01-19 03:19

    enter image description here

    <xsl:stylesheet version="2.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
    <xsl:output method="text"/>
    
    <xsl:template match="/">
    \documentclass{memoir}
    \usepackage{multirow}
    \begin{document}
    <xsl:apply-templates/>
    \end{document}
    </xsl:template>
    
    <xsl:template match="table">
    <xsl:variable name="noc" select="max(tr/sum(td/(@colspan/number(.),1)[1]))"/>
    <xsl:text>\begin{tabular}{*{</xsl:text>
    <xsl:value-of select="$noc"/>
    <xsl:text>}{l}}&#10;</xsl:text>
    <xsl:apply-templates select="tr[1]">
     <xsl:with-param name="rspans" select="for $i in 1 to xs:integer($noc) return 0"/>
    </xsl:apply-templates>
    <xsl:text>\end{tabular}</xsl:text>
    </xsl:template>
    
    <xsl:template match="tr">
     <xsl:param name="rspans"/>
    <xsl:text/>% [<xsl:value-of select="$rspans"/>]
     <xsl:variable name="tr" select="."/>
     <xsl:for-each select="$rspans">
      <xsl:variable name="c" select="position()"/>
      <xsl:variable name="td" select="$tr/td[count($rspans[position() &lt;=$c][.=0])]"/>
      <xsl:if test=".=0">
       <xsl:if test="$td/@rowspan[. &gt; 1]">
        <xsl:text>\multirow{</xsl:text>
        <xsl:value-of select="$td/@rowspan"/>
        <xsl:text>}{*}{</xsl:text>
       </xsl:if>
       <xsl:apply-templates select="$td"/>
       <xsl:if test="$td/@rowspan[. &gt; 1]">}</xsl:if>
      </xsl:if>
      <xsl:choose>
       <xsl:when test=". &gt;1 and position()=last()">&amp;\\&#10;</xsl:when>
       <xsl:when test="position()=last()">\\&#10;</xsl:when>
       <xsl:otherwise>&amp;</xsl:otherwise>  
      </xsl:choose>
     </xsl:for-each>
     <xsl:apply-templates select="following-sibling::tr[1]">
      <xsl:with-param name="rspans" select="for $c in 1 to count($rspans)
       return
       ($rspans[$c] +
       td[count($rspans[position() &lt;=$c][.=0])]/(@rowspan,1)[1]
       -1)"/>
     </xsl:apply-templates>
    </xsl:template>
    
    </xsl:stylesheet>
    
    0 讨论(0)
提交回复
热议问题
First Name: Bill Gates