首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过XSLT处理html时需要插入节点

通过XSLT处理html时需要插入节点
EN

Stack Overflow用户
提问于 2011-03-22 21:51:43
回答 1查看 460关注 0票数 1

我正在使用XSLT 1.0将html转换为xml。以下是我的输入

代码语言:javascript
复制
<table>
<tr id=1>
   <td rowspan=2>
   <td>
</tr>
<tr id=2>
   <td>   
</tr>
</table>

这是html中的普通行跨度代码。如果我在td(id=1)中有一个属性rowspan,我必须在tr (id=2)中已经存在的td前面创建一个新元素td .The连续tr中新元素td的数量取决于rowspan的值。

如何在xsl template (或)任何xslt转换后的post过程中提前帮助..please me..Thanks ..

我会说得更清楚..

表格是3 *3.考虑每一行的第一列是merged.so我的输入html看起来像这样

代码语言:javascript
复制
<table>
<tr id="1">
    <td  rowspan="3">
         </p>
    </td>
   <td>
      </p>
   </td>
   <td>
      </p>
   </td>
</tr>
<tr id="2">
    <td>
         </p>
   </td>
   <td>
         </p>
   </td>
</tr>
<tr id="3">
   <td> 
         </p>
   </td>
   <td>
         </p>
   </td>
</tr>
</table>

带有id=2 &3的tr有两个td,这意味着第一列与第一个tr-->td合并,第一个tr-->td的rowspan值为3(即合并包括当前行单元格的3行)。我的结果应该是

代码语言:javascript
复制
<w:tbl> <!-- represents table -->
<w:tr> <!-- represents table tr-->
  <w:tc>   <!-- represents table td-->
     <w:tcPr>  <!-- represents td style-->
         <w:vMerge w:val="restart"/> <!-- added due to having rowspan attribute-->
      </w:tcPr>
       <w:p/>
  </w:tc>
  <w:tc>
       <w:p/>
  </w:tc>
  <w:tc>
       <w:p/>
  </w:tc>
</w:tr>
<w:tr>
    <w:tc>  <!-- have to add this node in addition-->
          <w:tcPr>  
              <w:vMerge/>
          </w:tcPr>           
          <w:p/>
    </w:tc>
    <w:tc> 
         <w:p/>
    </w:tc>
    <w:tc>
         <w:p/>
    </w:tc>
<w:tr>
<w:tr>
    <w:tc>  <!-- have to add this node in addition-->
          <w:tcPr>  
              <w:vMerge/>
          </w:tcPr>           
          <w:p/>
    </w:tc>
    <w:tc>
          <w:p/>
     </w:tc>
     <w:tc>
          <w:p/>
     </w:tc>
<w:tr>
</w:tbl>
EN

回答 1

Stack Overflow用户

发布于 2011-03-22 22:57:57

更新:我的最新方法是根据第一行中的单元格数量和它们的rowspan值来计算所需的单元格总数。因此,下面的输入:

代码语言:javascript
复制
<table>
<tr id="1">
   <td rowspan="3"/>
   <td rowspan="2"/>
   <td/>
</tr>
<tr id="2">
   <td/>   
</tr>
<tr id="3">
   <td rowspan="2"/>
   <td/>   
</tr>
</table>

应该会产生以下输出:

代码语言:javascript
复制
<table>
<tr id="1">
   <td rowspan="3"/>
   <td rowspan="2"/>
   <td/>
</tr>
<tr id="2">
   <td/><td/><td/><td/><td/><td/>   
</tr>
<tr id="3">
   <td/><td/><td/><td rowspan="2"/>
   <td/>   
</tr>
</table>

也就是说,每行应占6个单元格(基于在第一行中看到的内容)。这比我的第一次尝试灵活多了。

注意:不清楚OP想要的输出是什么,但是您可以通过简单地输出一个具有适当rowspan值的新单元格,而不是多个新单元格,来省去很多麻烦。

以下是样式表:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="rowspan">
        <xsl:call-template name="sum">
            <xsl:with-param name="nodes" select="/table/tr[1]/td" />
        </xsl:call-template>
    </xsl:variable>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="tr[position() &gt; 1]/td[1]">
        <xsl:variable name="currcount">
            <xsl:call-template name="sum">
                <xsl:with-param name="nodes" select="../td" />
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="needed" select="$rowspan - $currcount" />
        <xsl:if test="$needed &gt; 0">
            <xsl:call-template name="loop">
                <xsl:with-param name="i">0</xsl:with-param>
                <xsl:with-param name="count">
                    <xsl:value-of select="$needed" />
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template name="loop">
        <xsl:param name="i" />
        <xsl:param name="count" />
        <td />
        <xsl:if test="$i &lt; $count - 1">
            <xsl:call-template name="loop">
                <xsl:with-param name="i">
                    <xsl:value-of select="$i + 1" />
                </xsl:with-param>
                <xsl:with-param name="count">
                    <xsl:value-of select="$count" />
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    <!-- modified version of @Tomalak's code in question 1333558 -->
    <xsl:template name="sum">
        <xsl:param name="nodes" />
        <xsl:param name="sum" select="0" />
        <xsl:variable name="curr" select="$nodes[1]" />
        <!-- if we have a node, calculate & recurse -->
        <xsl:if test="$curr">
            <xsl:variable name="runningsum">
                <xsl:choose>
                    <xsl:when test="$curr[@rowspan]">
                        <xsl:value-of select="$sum + $curr/@rowspan" />
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="$sum + 1" />
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            <xsl:call-template name="sum">
                <xsl:with-param name="nodes" 
                                select="$nodes[position() &gt; 1]" />
                <xsl:with-param name="sum" select="$runningsum" />
            </xsl:call-template>
        </xsl:if>
        <!-- if we don't have a node (last recursive step), return sum -->
        <xsl:if test="not($curr)">
            <xsl:value-of select="$sum" />
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

我希望有人能提出一个更简短、更优雅的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5392334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档