2015-10-16 78 views
1

需要将HTML表格转换为XML。在HTML中,我们有表头一样,在xslt或其他解决方案中设置/获取循环变量

<table> 
 
    <tr> 
 
    <td>1</td> 
 
    <td>2</td> 
 
    <td>3</td> 
 
    <td colspan="2">45</td> 
 
    <td>6</td> 
 
    <td>7</td> 
 
    </tr> 
 
    <tr> 
 
    <td>1</td> 
 
    <td>2</td> 
 
    <td>3</td> 
 
    <td>4</td> 
 
    <td>5</td> 
 
    <td>6</td> 
 
    <td>7</td> 
 
    </tr> 
 
<table/>
在XML结果一定会适得其反抛出考虑行跨度属性值的所有elments。

<zr> 
    <zc r="1" l="1"> 
    <zl>1</zl> 
    </zc> 
    <zc r="2" l="1"> 
    <zl>2</zl> 
    </zc> 
    <zc r="3" l="1"> 
    <zl>3</zl> 
    </zc> 
    <zc r="4" l="2"> 
    <zl>45</zl> 
    </zc> 
    <zc r="6" l="1"> 
    <zl>6</zl> 
    </zc> 
    <zc r="7" l="1"> 
    <zl>7</zl> 
    </zc> 
</zr> 
<zr> 
    <zc r="1" l="1"> 
    <zl>1</zl> 
    </zc> 
    <zc r="2" l="1"> 
    <zl>2</zl> 
    </zc> 
    <zc r="3" l="1"> 
    <zl>3</zl> 
    </zc> 
    <zc r="4" l="1"> 
    <zl>4</zl> 
    </zc> 
    <zc r="5" l="1"> 
    <zl>5</zl> 
    </zc> 
    <zc r="6" l="1"> 
    <zl>6</zl> 
    </zc> 
    <zc r="7" l="1"> 
    <zl>7</zl> 
    </zc> 
</zr> 

在XMLT中,我不知道如何在循环中设置/获取变量。这可能吗? XMLT 1.0

回答

0

不,这是不可能的,因为XSLT是一种功能语言。它没有可变变量,也没有循环。 (xsl:for-each不是一个循环,它是一个映射表达式,它将相同的操作应用于序列中的每个项目,概念上是并行的而不是顺序的)。

解决问题的方法(在函数式语言中常常是这种情况)是使用递归:具体来说,我称之为“兄弟递归”的技巧。

从tr元素,过程的第一个TD孩子:

<xsl:template match="tr"> 
<xsl:apply-templates select="td[1]" mode="sib"> 
    <xsl:with-param name="col" select="1"/> 
</xsl:apply-templates> 
</xsl:template> 

从TD元素,过程中的下一个兄弟TD孩子:

<xsl:template match="td" mode="sib"> 
<xsl:param name="col"/> 
<zc col="$col"/> 
<xsl:apply-templates select="following-sibling::td[1]" mode="sib"> 
    <xsl:with-param name="col"> 
    <xsl:choose> 
     <xsl:when test="@colspan"> 
     <xsl:value-of select="$col + @colspan"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$col + 1"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:with-param> 
</xsl:apply-templates> 
</xsl:template> 

(这是一个与XSLT 2.0更详细! )

相关问题