Telephone:<...">

XML table for LaTeX

Suppose I have an XML form table

<table> <tr> <td>First Name:</td> <td>Bill Gates</td> </tr> <tr> <td rowspan="2">Telephone:</td> <td>555 77 854</td> </tr> <tr> <td>555 77 855</td> </tr> </table> 

which I want to convert to LaTeX using XSLT (I stole this example elsewhere). As a result i want

 \documentclass{memoir} \usepackage{multirow} \begin{document} \begin{tabular}{*{10}{c}} First name & Bill Gates &\\ \multirow{2}{*}{Telephone:} & 555 77 854 &\\ & 555 77 855 & \end{tabular} \end{document} 

For the most part, there is a fair one-to-one correspondence between the two table formats. So this works pretty well for the most part:

 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" omit-xml-declaration="yes" encoding="UTF-8"/> <xsl:template match="/"> \documentclass{memoir} \usepackage{multirow} \begin{document} <xsl:apply-templates/> \end{document} </xsl:template> <xsl:template match="table"> \begin{tabular}{*{10}{c}} <xsl:apply-templates/> \end{tabular} </xsl:template> <xsl:template match="tr"> <xsl:apply-templates />\\ </xsl:template> <xsl:template match="td[not(@rowspan) and not(@colspan)]"> <xsl:apply-templates/> &amp; </xsl:template> <xsl:template match="td[not(@colspoan)]"> \multirow{<xsl:value-of select="@colspan"/>}{*}{<xsl:apply-templates/>} &amp; </xsl:template> <xsl:template match="td[not(@rowspan)]"> \multicolumn{<xsl:value-of select="@colspan"/>}{l}{<xsl:apply-templates/>} &amp; </xsl:template> <xsl:template match="td"> \multirow{<xsl:value-of select="@rowspan"/>}{*}{\multicolumn{<xsl:value-of select="@colspan"/>}}{l}{<xsl:apply-templates/>} &amp; </xsl:template> </xsl:stylesheet> 

The problem is &amp; (which become & exit). In LaTeX, you will need one at the beginning of the third line, where the extended cell is located. This does not apply to the XML table. How can I get around this problem?

+5
source share
1 answer

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> 
+8
source

Source: https://habr.com/ru/post/1207234/


All Articles