我有以下XSLT,它按预期工作;现在我需要调整它以便我可以得到每个tgroup的所有colwidth的总和,这将允许我在父表中添加一个新类以便以后进行格式化。
使用下面的XSLT,我一直在检查tgroup元素上@cols =“”的值,但它不像@colwidth值那样精确。一些小表可能有更多的4列,它们被视为中型或大型表。
目标是为冷却总数等于或大于400pt的每个tgroup添加属性@tablesize="bigtable"
,对于总colwidth值等于或大于250pt的tgroup添加@tablesize="mediumtable"
,并将带宽值低于249pt的tgroup添加添加@tablesize="smalltable"
。
我还没有找到实现这一点的直接方式,这就是我要问的原因。 感谢。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" id="topic-id" ditaarch:DITAArchVersion="1.2">
<title>My Tables</title>
<body>
<p>Some test tables that need to be transformed.</p>
<table frame="none" id="table_t4k_bgk_sn">
<title>Test 1 - Medium table</title>
<tgroup cols="4">
<colspec colname="c1" colnum="1" colwidth="75pt"/>
<colspec colname="c2" colnum="2" colwidth="75pt"/>
<colspec colname="c3" colnum="3" colwidth="75pt"/>
<colspec colname="c4" colnum="4" colwidth="75pt"/>
<thead>
<row>
<entry/>
<entry/>
<entry/>
<entry/>
</row>
</thead>
<tbody>
<row>
<entry>This cell 1</entry>
<entry>Cell 2</entry>
<entry>Cell 3</entry>
<entry>Cell 4</entry>
</row>
<row>
<entry>Test 2</entry>
<entry>Test 3</entry>
<entry>Test 4</entry>
<entry>Test 5</entry>
</row>
<row>
<entry>Test 7</entry>
<entry>Test 8</entry>
<entry>Test 9</entry>
<entry>Test 10</entry>
</row>
<row>
<entry>Test 12</entry>
<entry>Test 13</entry>
<entry>Test 14</entry>
<entry>Test 15</entry>
</row>
<row>
<entry>Test 17</entry>
<entry>Test 18</entry>
<entry>Test 19</entry>
<entry>Test 20</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="none" id="table_qhj_dgk_sn">
<title>Test 2 - Big table</title>
<tgroup cols="7">
<colspec colname="c1" colnum="1" colwidth="75pt"/>
<colspec colname="c2" colnum="2" colwidth="75pt"/>
<colspec colname="c3" colnum="3" colwidth="75pt"/>
<colspec colname="c4" colnum="4" colwidth="75pt"/>
<colspec colname="c5" colnum="5" colwidth="75pt"/>
<colspec colname="c6" colnum="6" colwidth="75pt"/>
<colspec colname="c7" colnum="7" colwidth="75pt"/>
<thead>
<row>
<entry/>
<entry/>
<entry/>
<entry/>
<entry/>
<entry/>
<entry/>
</row>
</thead>
<tbody>
<row>
<entry>Test 1</entry>
<entry>Test 2</entry>
<entry>Test 3</entry>
<entry> Test 4</entry>
<entry>Test 5</entry>
<entry>Test 6</entry>
<entry>Test 7</entry>
</row>
<row>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
</row>
<row>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
</row>
<row>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
<entry>Test </entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="none" id="table_zcb_fgk_sn">
<title>Test 3 - Small table</title>
<tgroup cols="2">
<colspec colname="c1" colnum="1" colwidth="75pt"/>
<colspec colname="c2" colnum="2" colwidth="75pt"/>
<thead>
<row>
<entry/>
<entry/>
</row>
</thead>
<tbody>
<row>
<entry>Test </entry>
<entry>Test </entry>
</row>
<row>
<entry>Test </entry>
<entry>Test </entry>
</row>
</tbody>
</tgroup>
</table>
</body>
</topic>
这是我的XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[tgroup]">
<xsl:copy>
<xsl:choose>
<xsl:when test="tgroup/@cols >= 5">
<xsl:attribute name="tablesize">bigtable</xsl:attribute>
<xsl:copy-of select="@*"/>
<xsl:apply-templates />
</xsl:when>
<xsl:when test="tgroup/@cols >= 3">
<xsl:attribute name="tablesize">mediumteble</xsl:attribute>
<xsl:copy-of select="@*"/>
<xsl:apply-templates />
</xsl:when>
<xsl:when test="tgroup/@cols <= 2">
<xsl:attribute name="tablesize">smalltable</xsl:attribute>
<xsl:copy-of select="@*"/>
<xsl:apply-templates />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates />
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
尝试用此代替您的*[tgroup]
模板......
<xsl:template match="*[tgroup]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="tablesize">
<xsl:variable name="width" select="sum(tgroup/colspec/number(replace(@colwidth,'[^0-9]','')))"/>
<xsl:choose>
<xsl:when test="$width >= 400">
<xsl:text>bigtable</xsl:text>
</xsl:when>
<xsl:when test="$width >= 250">
<xsl:text>mediumtable</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>smalltable</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:0)
您可以使用tgroup/colspec/@colwidth
选择XP {{1}}
在此之前,您需要将@colwidth转换为数字,方法是将 pt 替换为空。对话sum
有更多通用解决方案