2012-10-18 76 views
0

我有一個問題,我需要從XML生成HTML,我可以有多個嵌套在對方的標籤。我如何通過遞歸來傳遞它們?Xslt遞歸與動態XML

這裏是從XML樣本:

<rows> 
    <row> 
     <cell>1</cell> 
     <cell>2</cell> 
     <cell>1</cell> 
     <cell>2</cell> 
     <row> 
     <cell>3</cell> 
     <cell>4</cell> 
      <row> 
       <cell>5</cell> 
       <cell>6</cell> 
       <cell>6</cell> 
      </row> 
     </row> 
    </row> 
</rows> 

我的XSLT是:

<table> 
     <th>1</th><th>2</th>3<th>4</th><th>5</th> 
     <xsl:for-each select="rows/row"> 
     <tr> 
      <xsl:for-each select="cell"> 
      <td> 
       <xsl:value-of select="."/> 
      </td> 
      </xsl:for-each> 
     </tr> 
     <xsl:for-each select="row"> 
      <tr> 
      <xsl:for-each select="cell"> 
       <td> 
       <xsl:value-of select="."/> 
       </td> 
      </xsl:for-each> 
      </tr> 
     </xsl:for-each>  
     </xsl:for-each> 
    </table> 

所以現在我的問題是我怎麼能顯示每行中的所有atributes?

編輯:從XSLT生成HTML

<html><body> 
<table> 
<th>1</th> 
<th>2</th> 
<th>3</th> 
<th>4</th> 
<th>5</th> 

<tr> 
<td>1</td> 
<td>2</td> 
<td>1</td> 
<td>2</td> 
</tr> 
<tr> 
<td>3</td> 
<td>4</td> 
</tr> 
</table> 
</body></html> 

第二個編輯:

XSLT:

<xsl:template match="cell"> 


    <td style="overflow:hidden;border:1px solid black;"> 
     <div style="width:100px;height:20px;margin-bottom: 10px;margin-top: 10px;"> 

      <xsl:variable name="id1" select="row/@id"/> 

      <xsl:if test="starts-with(id1, 'Dir')"> 
       <xsl:value-of select="cell/@image"/> 
      </xsl:if> 

      <xsl:value-of select="."/> 


     </div> 
     </td> 

    </xsl:template> 

XML:

<row id="Dir_44630"> 
    <cell>Text</cell> 
    <cell>1</cell> 
    <cell>1.00</cell> 
    <cell>3</cell> 
    <cell 4</cell> 
    <cell>5</cell> 
    <cell>6</cell> 
    <cell>7</cell> 
</row> 
+3

不要使用'for-each',它會讓你生氣。 XSLT是一種聲明性語言。將樣式表基於模板而非循環要容易得多。另外,你的意思是什麼?您的示例輸入中沒有任何內容或輸出。 – toniedzwiedz

+0

通過屬性我的意思是獲取單元格值:1,2,3,4,5和6. – Aleks

+2

您可以顯示此文檔所需的輸出嗎?我不確定你想要達到什麼目的。 – toniedzwiedz

回答

1

首先,在你的情況,你將開始有一個模板來匹配您的根元素

<xsl:template match="/rows"> 

在此,你將不得不代碼來構建你的表頭,然後開始尋找孩子元素

<xsl:template match="/rows"> 
    <table> 
     <!-- Header --> 
     <xsl:apply-templates select="row"/> 
    </table> 
</xsl:template> 

你會然後有一個模板匹配元素,因此您可以輸出tr元素,然後查找單個單元格

<xsl:template match="row"> 
    <tr> 
     <xsl:apply-templates select="cell"/> 
    </tr> 
    <xsl:apply-templates select="row"/> 
</xsl:template> 

注意遞歸調用繼續尋找行被嵌套在當前元素元素。

同樣,你將有一個模板來匹配細胞元素,這將只是輸出TD元素,單元格的值。

我不確定的唯一的事情是你的規則應該輸出哪些行。看起來您不想輸出嵌套兩個或更多級別的元素。在這種情況下,你可以添加一個模板,忽略其中至少有兩個或兩個以上行是祖先行

<xsl:template match="row[ancestor::row[2]]"/> 

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/rows"> 
     <table> 
     <tr> 
      <th>1</th> 
      <th>2</th> 
      <th>3</th> 
      <th>4</th> 
      <th>5</th> 
     </tr> 
     <xsl:apply-templates select="row"/> 
     </table> 
    </xsl:template> 

    <xsl:template match="row"> 
     <tr> 
     <xsl:apply-templates select="cell"/> 
     </tr> 
     <xsl:apply-templates select="row"/> 
    </xsl:template> 

    <xsl:template match="row[ancestor::row[2]]"/> 

    <xsl:template match="cell"> 
     <td> 
     <xsl:value-of select="."/> 
     </td> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的示例XML,以下輸出

<table> 
    <tr> 
     <th>1</th> 
     <th>2</th> 
     <th>3</th> 
     <th>4</th> 
     <th>5</th> 
    </tr> 
    <tr> 
     <td>1</td> 
     <td>2</td> 
     <td>1</td> 
     <td>2</td> 
    </tr> 
    <tr> 
     <td>3</td> 
     <td>4</td> 
    </tr> 
</table> 

編輯:如果你想在模板中的一行訪問屬性元素的匹配細胞元素,你需要指定它的父元素,像這樣

<xsl:variable name="id1" select="../@id"/> 

select="row/@id"實際上將尋找一個行,它是當前電池元件的孩子。

+0

非常感謝您這樣做,但是現在我在顯示圖像時出現了一個問題,當該行具有以Dir開頭的id時,如果發生這種情況,我需要在第一個單元格數據旁邊打印圖像。我是xslt中的新成員,很難理解它是如何工作的。我已將我的示例放在第二個編輯中。 – Aleks

+0

問問題沒有問題,但你應該問一個全新的問題。如果您在回答問題後根據新的要求編輯問題,會變得困惑。儘管開始一個新的問題是完全正確的。 –

+0

xml和完整的解決方案顯示在這裏,所以我認爲這將是更容易爲大家解決第二個問題,我知道這個問題已經得到了一種大,所以這將是我最後一次編輯我保證:)。 – Aleks