gpt4 book ai didi

xml - 使用 XSLT 将 XHTML 表转换为 LaTeX

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:01 26 4
gpt4 key购买 nike

我是 XSLT (v1.0) 的新手,我无法使用 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”。所以,在上面的例子中,它只会创建一个单列表。

我想做的是计算 td 的数量,以及 colspans 的数量(如果存在),以创建一个包含 3 列的正确表格。

有人知道怎么做吗?提前致谢。

最佳答案

这在 XSLT2 中更容易,但您可以在 XSLT 1 中使用 (//*)[position() <= n] 习惯用法来迭代 n 次。我还稍微修正了你的 TeX:自 1993 年发布 latex2e 以来,\bf 已被弃用:-)


<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}

关于xml - 使用 XSLT 将 XHTML 表转换为 LaTeX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com