2015-10-16 52 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更詳細! )

相關問題