2013-11-23 49 views
0

我有一個帶分隔符的文本,我想用XSLT 2.0(撒克遜)格式化爲HTML表格。文本blob(在本例中爲參數myTable)包含以| c |分隔的記錄。在第6條記錄後,它應該成爲一個新的行。還有一個| r |我可以使用分隔符。XSLT 2.0 - For-Each-Group與Tokenize

所以我想我會用記號化在列分隔符,將HTML標籤欄,然後使用換各組將HTML行標籤。但是,直到現在,只寫了相當簡單的XSLT,我正在努力正確使用。

當使用下面的XML時,我得到一個錯誤,說明for-each-group必須是node()類型,而不是xs:string,這是tokenize生成的。

我懷疑我以一種根本錯誤的方式接近這一點,但我堅持使用XSLT和這個傳入的blob。任何建議感激!

<xsl:param name="myTable" /> 
<xsl:param name="tdSeparator" select="'\|c\|'"/> 
<xsl:param name="trSeparator" select="'\|r\|'"/> 

<xsl:template name="makeTable"> 
    <xsl:for-each-group select="fn:tokenize($myTable,$tdSeparator)" group-ending-with="*[position() mod 6 = 0]">  
    <tr> 
     <xsl:for-each select="current-group()"> 
      <td><xsl:copy-of select="current()" /></td> 
     </xsl:for-each> 
    </tr> 
</xsl:for-each-group> 
</xsl:template> 

<xsl:template match="xvar:metric1" xmlns:xvar="http://test.com/xvar/example"> 

<root> 
    <html> 
    <HEAD> 
    <META content="text/html; charset=us-ascii" /> 
    </HEAD> 
    <body> 
     <p><strong>EMAIL HEADER</strong></p>   
     <p><strong>Key0: </strong> <xsl:value-of select="xvar:key0" /></p> 
     <p><strong>Value1: </strong> <xsl:value-of select="xvar:value1" /></p> 

etc... 

    <table> 
     <xsl:call-template name="makeTable" /> 
    </table> 

回答

2

我不認爲你需要什麼組,你可以簡單地使用tokenize兩次:然後

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs"> 


<xsl:output method="html" indent="yes"/> 

<xsl:param name="myTable" as="xs:string">col 1|c|col 2|c|col 3|r|1|c|2|c|3|r|4|c|5|c|6</xsl:param> 
<xsl:variable name="rows" as="xs:string*" select="tokenize($myTable, $trSeparator)"/> 

<xsl:param name="tdSeparator" select="'\|c\|'"/> 
<xsl:param name="trSeparator" select="'\|r\|'"/> 

<xsl:template name="makeTable"> 
    <table> 
    <thead> 
     <tr> 
     <xsl:for-each select="tokenize($rows[1], $tdSeparator)"> 
      <th> 
      <xsl:value-of select="."/> 
      </th> 
     </xsl:for-each> 
     </tr> 
    </thead> 
    <tbody> 
     <xsl:for-each select="$rows[position() gt 1]"> 
     <tr> 
      <xsl:for-each select="tokenize(., $tdSeparator)"> 
      <td> 
       <xsl:value-of select="."/> 
      </td> 
      </xsl:for-each> 
     </tr> 
     </xsl:for-each> 
    </tbody> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

輸出是

<table> 
    <thead> 
     <tr> 
     <th>col 1</th> 
     <th>col 2</th> 
     <th>col 3</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     </tr> 
     <tr> 
     <td>4</td> 
     <td>5</td> 
     <td>6</td> 
     </tr> 
    </tbody> 
</table> 

我假設有一個第一排與列名稱,但如果不是,那麼你只需要刪除該代碼,例如

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs"> 


<xsl:output method="html" indent="yes"/> 

<xsl:param name="myTable" as="xs:string">1|c|2|c|3|r|4|c|5|c|6</xsl:param> 
<xsl:variable name="rows" as="xs:string*" select="tokenize($myTable, $trSeparator)"/> 

<xsl:param name="tdSeparator" select="'\|c\|'"/> 
<xsl:param name="trSeparator" select="'\|r\|'"/> 

<xsl:template name="makeTable"> 
    <table> 
    <tbody> 
     <xsl:for-each select="$rows"> 
     <tr> 
      <xsl:for-each select="tokenize(., $tdSeparator)"> 
      <td> 
       <xsl:value-of select="."/> 
      </td> 
      </xsl:for-each> 
     </tr> 
     </xsl:for-each> 
    </tbody> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 
+0

輝煌 - 這工作非常好,謝謝! –