代码之家  ›  专栏  ›  技术社区  ›  imran

在xslt中出现错误宽度时,无法生成Td宽度值

  •  0
  • imran  · 技术社区  · 6 年前

    我有一张桌子和一个colgroup,我从colgroup中获取桌子td宽度,这在桌子的顶部提到。

    我需要定义td的宽度,这是特定的colgroup。例如:对于表中的第二个td,宽度取自第二组。

    它运转良好。但在td中出现colspan时,只需要位置col WITH值。我希望当colspan出现时,它应该取td宽度中所有之前的col和。

    输入

    <?xml version="1.0" encoding="UTF-8"?>
    <table size="s" orient="portrait" tablebodyrowalign="top" width="100">
      <colgroup>
        <col width="19%"/>
        <col width="6%"/>
        <col width="4%"/>
        <col width="9%"/>
        <col width="8%"/>
        <col width="3%"/>
        <col width="16%"/>
        <col width="4%"/>
        <col width="15%"/>
        <col width="2%"/>
        <col width="14%"/>
      </colgroup>
      <thead/>
      <tbody>
        <tr>
          <td colspan="5" align="center" valign="middle" fill="000080">
            <para style="TableBodyNoIndent">
              <emph type="Bold">Escrows and Reserves</emph>
              <emph type="Bold">
                <sup>(8)</sup>
              </emph>
            </para>
          </td>
          <td left="single" right="single" align="left" valign="top">
            <para style="TableBodyNoIndent"/>
          </td>
          <td colspan="5" left="single" top="single" right="single" bottom="single"
            align="center" valign="middle" fill="000080">
            <para style="TableBodyNoIndent">
              <emph type="Bold">Financial Information</emph>
              <emph type="Bold">
                <sup>(3)</sup>
              </emph>
            </para>
          </td>
        </tr>
      </tbody>
    </table>
    

    XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">
        <xsl:output method="xml" indent="yes"/>
       <xsl:strip-space elements="*"/>
       <xsl:template match="@*|node()">
           <xsl:copy>
               <xsl:apply-templates select="@*|node()"/>
           </xsl:copy>
       </xsl:template>
        <xsl:template match="table">
            <xsl:copy>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:template>
        <xsl:template match="tr">
            <xsl:copy>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:template>
        <xsl:template match="td">
            <xsl:copy>
            <xsl:attribute name="style">
                <xsl:variable name="pos">
                    <xsl:number/>    
                </xsl:variable>
    
                <xsl:choose>
                    <xsl:when test="preceding-sibling::td[@colspan]">
                        <xsl:if test="@fill">
                            <xsl:value-of select="concat('background-color: ','#',@fill, ';')"/>
                        </xsl:if>
                        <xsl:if test="@align">
                            <xsl:value-of select="concat('text-align:',@align,';')"/>
                        </xsl:if>
                        <xsl:value-of select="concat('width:', ancestor::table/colgroup/col[position() = preceding-sibling::td/@colspam +1]/@width, ';')"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:if test="@fill">
                            <xsl:value-of select="concat('background-color: ','#',@fill, ';')"/>
                        </xsl:if>
                        <xsl:if test="@align">
                            <xsl:value-of select="concat('text-align:',@align,';')"/>
                        </xsl:if>
                        <xsl:value-of select="concat('width:', ancestor::table/colgroup/col[position() = $pos]/@width, ';')"/>  
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    

    我试图将前面的td colspan值+1作为当前td位置,但它生成了空白td。请建议。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tim C    6 年前

    您可以定义一个变量来获取 td 考虑到科尔斯潘,就像这样

    <xsl:variable name="colpos" 
                  select="sum(preceding-sibling::td/@colspan) + count(preceding-sibling::td[not(@colspan)]) + 1" />
    

    或者在使用XSLT 2.0时,可以这样编写表达式。。。

    <xsl:variable name="colpos" 
                  select="sum(for $td in preceding-sibling::td return (if ($td/@colspan) then $td/@colspan else 1)) + 1" />
    

    或者这个。。。

    <xsl:variable name="colpos" 
                  select="sum(preceding-sibling::td/(if (@colspan) then number(@colspan) else 1)) + 1" />
    

    因此,将存在的colspan相加,并计算没有的colspan(实际上colspan为1)。

    然后你需要得到col组中col的数量来进行汇总,就像这样

    <xsl:variable name="colspan" 
                  select="if (@colspan) then number(@colspan) else 1" />
    

    然后得到 td 你能做到的

     <xsl:value-of 
          select="concat('width:', 
                    sum(ancestor::table/colgroup/col[position() ge $colpos and position() lt $colpos + $colspan]/number(replace(@width, '%', ''))), 
                    '%;')"/>  
    

    试试这个模板

    <xsl:template match="td">
      <xsl:copy>
        <xsl:attribute name="style">
          <xsl:if test="@fill">
            <xsl:value-of select="concat('background-color: ','#',@fill, ';')"/>
          </xsl:if>
          <xsl:if test="@align">
            <xsl:value-of select="concat('text-align:',@align,';')"/>
          </xsl:if>
          <xsl:variable name="colpos" select="sum(preceding-sibling::td/@colspan) + count(preceding-sibling::td[not(@colspan)]) + 1" />
          <xsl:variable name="colspan" select="if (@colspan) then number(@colspan) else 1" />
          <xsl:value-of select="concat('width:', sum(ancestor::table/colgroup/col[position() ge $colpos and position() lt $colpos + $colspan]/number(replace(@width, '%', ''))), '%;')"/>  
        </xsl:attribute>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>