colcount

CREATE OR REPLACE FUNCTION colcount(pvar_s VARCHAR2, pvar_mask VARCHAR2)
   RETURN INT
IS
   pvar_i       INT;
   pvar_len     INT;
   pvar_count   INT;
   pvar_inst    int;
BEGIN
   pvar_i := 0;
   pvar_len := LENGTH (pvar_s);
   pvar_count := 0;
 
   IF pvar_len = 0
   THEN
      RETURN pvar_count;
   END IF;
 
   WHILE pvar_i < pvar_len
   LOOP
      pvar_i := pvar_i + 1;
      pvar_inst := instr(pvar_s,pvar_mask,pvar_i);
      if pvar_inst>0 then
         pvar_i := pvar_inst;
         pvar_count := pvar_count + 1;
      end if;
   END LOOP;
 
   RETURN pvar_count + 1;
END colcount;

<xsl:template match="w:tbl"> <!-- 先确定列总数 --> <xsl:variable name="colCount" select="count(w:tblGrid/w:gridCol)"/> <fo:table table-layout="fixed" width="100%" border-collapse="collapse"> <!-- 生成精确列定义 --> <xsl:for-each select="w:tblGrid/w:gridCol"> <fo:table-column column-width="{@w:w div 20}pt"/> </xsl:for-each> <fo:table-body> <!-- 添加列数验证 --> <xsl:if test="count(w:tr[1]/w:tc) > $colCount"> <fo:table-row> <fo:table-cell number-columns-spanned="{$colCount}"> <fo:block color="red">表格列数溢出警告</fo:block> </fo:table-cell> </fo:table-row> </xsl:if> <xsl:apply-templates select="w:tr"/> </fo:table-body> </fo:table> </xsl:template> <!-- 表格行处理(安全版) --> <xsl:template match="w:tr"> <fo:table-row> <!-- 增强过滤逻辑:同时过滤被合并单元格和超列单元格 --> <xsl:apply-templates select="w:tc[ not(w:tcPr/w:vMerge/@w:val='continue') and sum(preceding-sibling::w:tc/w:tcPr/w:gridSpan/@w:val) + 1 <= count(ancestor::w:tbl/w:tblGrid/w:gridCol) ]"/> </fo:table-row> </xsl:template> <!-- 单元格模板(安全版) --> <xsl:template match="w:tc"> <fo:table-cell border="1pt solid black" padding="2pt" display-align="center"> <!-- 列合并安全处理 --> <xsl:variable name="maxSpan" select="count(ancestor::w:tbl/w:tblGrid/w:gridCol) - count(preceding-sibling::w:tc)"/> <xsl:if test="w:tcPr/w:gridSpan"> <xsl:attribute name="number-columns-spanned"> <xsl:choose> <xsl:when test="w:tcPr/w:gridSpan/@w:val > $maxSpan"> <xsl:value-of select="$maxSpan"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="w:tcPr/w:gridSpan/@w:val"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:if> <!-- 修正行合并计算逻辑 --> <xsl:if test="w:tcPr/w:vMerge[@w:val='restart']"> <xsl:variable name="rowSpan" select="count(following-sibling::w:tr[1]/w:tc[1][w:tcPr/w:vMerge/@w:val='continue']) + 1"/> <xsl:attribute name="number-rows-spanned"> <xsl:value-of select="($rowSpan > 10) * 1 + ($rowSpan <= 10) * $rowSpan"/> </xsl:attribute> </xsl:if> <fo:block linefeed-treatment="ignore" white-space-collapse="true"> <xsl:apply-templates select=".//w:p"/> </fo:block> </fo:table-cell> </xsl:template>这个转换脚本,行合并还算正常,但是列合并会全部丢失,怎么办?请给出修改后的代码
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值