如果我自己走得足够远,我会发布它以供将来参考.
解决方法 我提出了一个比@Flack链接到的更简单的解决方案:<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/transform" version="1.0"><xsl:template match="tbody"> <xsl:variable name="maxColumns"> <xsl:for-each select="tr"> <xsl:sort select="sum(td/@colspan) + count(td[not(@colspan)])" data-type="number"/> <xsl:if test="position() = last()"> <xsl:value-of select="sum(td/@colspan) + count(td[not(@colspan)])"/> </xsl:if> </xsl:for-each> </xsl:variable> <tgroup> <xsl:attribute name="cols"> <xsl:value-of select="$maxColumns"/> </xsl:attribute> <xsl:apply-templates select="@*|node()"/> </tgroup></xsl:template><xsl:template match="td[@colspan > 1]"> <entry> <xsl:attribute name="namest"> <xsl:value-of select="sum(preceding-sibling::td/@colspan) + count(preceding-sibling::td[not(@colspan)]) + 1"/> </xsl:attribute> <xsl:attribute name="nameend"> <xsl:value-of select="sum(preceding-sibling::td/@colspan) + count(preceding-sibling::td[not(@colspan)]) + @colspan"/> </xsl:attribute> <xsl:apply-templates select="@*[name() != 'colspan']|node()"/> </entry></xsl:template><xsl:template match="tr"> <row> <xsl:apply-templates select="@*|node()"/> </row></xsl:template><xsl:template match="td"> <entry> <xsl:apply-templates select="@*|node()"/> </entry></xsl:template><xsl:template match="td/@rowspan"> <xsl:attribute name="morerows"> <xsl:value-of select=". - 1"/> </xsl:attribute></xsl:template><!-- fallback rule --><xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy></xsl:template></xsl:stylesheet>
有两个棘手的问题.首先,CALS表需要包含列数的tgroup / @cols属性.因此,我们需要在xhtml表中找到一行中的最大单元格数 – 但我们必须注意colspan声明,以便具有colspan>的单元格. 1创建正确数量的列!我的样式表中的第一个模板就是基于@Tim C对max cells per row problem的回答.
另一个问题是,对于多列单元格,xhtml表示“此单元格为3列宽”(colspan =“3”),而CALS将说“此单元格从第2列开始,在第4列结束”(namest =“2”nameend = “4”).该转换在样式表的第二个模板中完成.
其余的确相当简单.样式表没有处理诸如将style =“wIDth:50%”更改为wIDth =“50%”等细节,但我认为这些是相对常见的问题.
总结以上是内存溢出为你收集整理的HTML到CALS表?全部内容,希望文章能够帮你解决HTML到CALS表?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)