fo:表到html表 - xslt

时间:2015-04-01 07:40:32

标签: xslt xslt-1.0 xslt-2.0 xsl-fo jaxp

我正在尝试编写一个xslt来生成另一个xslt,目的是用html标签替换所有xsl:fo.XSLT 1

我在“xsl”命名空间周围使用CDATA,以避免xslt处理这种标记。我的范围只处理xsl:fo指令并替换为例如:

<fo:table table-layout="fixed" width="100%" font-size="10pt">
                    <fo:table-column column-width="proportional-column-width(0.65)"/>
                    <fo:table-column column-width="proportional-column-width(0.35)"/>
                    <fo:table-body>
                        <fo:table-row>
                            <fo:table-cell padding-before="0.5cm"></fo:table-cell>
                            <fo:table-cell padding-before="0.5cm">
                            <fo:block>
                                y

                         <![CDATA[    --> this is treated as text so i can copy it with <xsl-valueof select="."/>??

                                 <xsl:choose>
                              <xsl:when test="...xpath'">
                              <xsl:value-of select="..." />,
                              </xsl:when>
                              <xsl:otherwise>
                            at <xsl:value-of select=..." />,
                            </xsl:otherwise>
                           </xsl:choose>]]>
                            </fo:block>
                                <fo:block space-before="0.5cm" text-align="center">
                                x
                                </fo:block>
                            </fo:table-cell>
                        </fo:table-row>
                    </fo:table-body>
                </fo:table>

我想要traslate fo:table + fo:table-body with table tag,fo:table-column with td width =“..%”,fo:table-row with tr .. td width不是那么容易检索因为width属性属于fo:table-column而fo:table-cell处理标记。

我尝试循环fo:table-column当我读取一个表格单元格我正在编写td并使用由先前标记fo:table-column获得的属性column-width计算宽度:我使用position() fo:table-cell selection

中的tag table-column(第一个循环)

例如这里是xsl:fo的xslt tralslator(上面提到的):

<xsl:template name="fo-table">
<xsl:param name="font-size" />
<xsl:param name="width" />
<xsl:variable name="cols" select="count(fo:table-column)"/> 
<xsl:if test="fo:table-column">
    <xsl:variable name="effective-cols" select="count(fo:table-body/fo:table-row/fo:table-cell)"/>
    <xsl:if test="$cols = $effective-cols">
    <table>
      <xsl:for-each select="fo:table-body/fo:table-row">
              <tr>
                  <xsl:for-each select="parent::*/parent::*/fo:table-column">
                         <xsl:variable name="width-proportional">
                               <xsl:value-of select="@column-width"/>
                         </xsl:variable>
                          <td>
                              <xsl:attribute name="width">
                                  <xsl:call-template name="getPercentWidth">
                                      <xsl:with-param name="proportional-value-width"><xsl:value-of select="$width-proportional"/></xsl:with-param>
                                  </xsl:call-template>
                              </xsl:attribute>
                              abc <xsl:variable name="vPosition"><xsl:value-of select="position()"/></xsl:variable>
                                  <xsl:for-each select="parent::*/fo:table-body/fo:table-row/*[$vPosition]">
<xsl:value-of select="local-name()"/><xsl:text> #10;</xsl:text> <!-- debug-->
                                       <xsl:choose>
                                           <xsl:when test="fo:block">
                                               <xsl:for-each select="fo:block">
                                                <xsl:call-template name="fo-block-table">
                                                    <xsl:with-param name="text-align"><xsl:value-of select="@text-align"/></xsl:with-param>
                                                    <xsl:with-param name="space-before"><xsl:value-of select="@space-before"/></xsl:with-param>
                                                </xsl:call-template>
                                            </xsl:for-each>
                                        </xsl:when>
                                        <xsl:otherwise>
                                            empty cell
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </xsl:for-each>
                          </td>
                  </xsl:for-each>    
              </tr>        
      </xsl:for-each>
     </table>
    </xsl:if>
</xsl:if>
</xsl:template>

<xsl:template name="fo-block-table">
     <xsl:param name="text-align" />
     <xsl:param name="space-before" />
     <xsl:choose>
         <xsl:when test="$text-align">
                <div>
                <xsl:attribute name="text-align">
                    <xsl:value-of select="normalize-space($text-align)"/>
                </xsl:attribute>
                <xsl:apply-templates select="."/>
                </div>
        </xsl:when>
        <xsl:otherwise>
            <div>
                <xsl:apply-templates select="."/>
            </div>
        </xsl:otherwise>
    </xsl:choose>
 </xsl:template>



   <xsl:template name="getPercentWidth">
    <xsl:param name="proportional-value-width"/>
    <xsl:variable name="width" select="normalize-space($proportional-value-width)"/>
    <xsl:variable name="begin"> <xsl:value-of select="string-length(substring-before($width, '('))" /></xsl:variable>
    <xsl:variable name="last"> <xsl:value-of select="string-length(substring-before($width,')'))" /></xsl:variable>
    <xsl:variable name="val" select="fn:substring($width, $begin, $last)" />
    <xsl:variable name="val1" select="substring-after($val,'(')"/>
    <xsl:variable name="cent" select="100"/>
    <xsl:value-of select="concat(($val1 * $cent),'%')"/>    
</xsl:template>

但是我无法理解为什么所有的td都包含'y',x和空,当它只属于空表格单元时,似乎它只读取所有的fo:block ..

  <table>
    <tr>
         <td width="65%">
                       abc
                      table-cell #10;
                       empty cell
                      table-cell #10;<div>
                        y
              </div>
      <div text-align="center">
              x
            </div>
          </td>
         <td width="35%">
             abc
            table-cell #10;
              empty cell
             table-cell #10;<div>
             y
       </div>
     <div text-align="center">
          x
      </div>
   </td>
</tr>
</table>

我需要获得:

   <table>
    <tr>
       <td width="65%">
              abc
                table-cell #10;
                empty cell                               
       </td>
       <td width="35%">
               abc

            table-cell #10;

            <div>
                y
               </div>
             <div text-align="center">
                  x
             </div>
    </td>
    </tr>
  </table>

如果我替换第二个循环     xsl:for-each 与

xsl : template

什么都不匹配! 也许* [$ vPosition]不起作用但如果我替换1或2之类的数字它会起作用。

怎么了?

感谢您的建议!

拉​​吉

1 个答案:

答案 0 :(得分:0)

问题出在这条线上......

<xsl:for-each select="parent::*/fo:table-body/fo:table-row/*[$vPosition]">

或者更确切地说,这取决于vPosition变量的定义方式:

<xsl:variable name="vPosition"><xsl:value-of select="position()"/></xsl:variable>

使用xsl:value-of实际上导致vPosition设置为字符串值,而不是数值。在条件中使用字符串值时,如[*$vPosition],如果该字符串不为空,它将始终返回true。

尝试将变量声明更改为此,将vPosition设置为数字

<xsl:variable name="vPosition" select="position()" />