XSLT检查每个tgroup的colwidth总和,并向表中添加新属性

时间:2014-04-09 22:03:32

标签: xml xslt

我有以下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 &gt;= 5">
                    <xsl:attribute name="tablesize">bigtable</xsl:attribute>
                    <xsl:copy-of select="@*"/>
                    <xsl:apply-templates />
                </xsl:when>

                <xsl:when test="tgroup/@cols &gt;= 3">
                    <xsl:attribute name="tablesize">mediumteble</xsl:attribute>
                    <xsl:copy-of select="@*"/>
                    <xsl:apply-templates />
                </xsl:when>

                <xsl:when test="tgroup/@cols &lt;= 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>

2 个答案:

答案 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

有更多通用解决方案