2012-02-16 63 views
1

我試圖使用XSLT將ss:Type="Number"分配給標題中具有數字的列中的所有數據單元格。到目前爲止,我只能將它正確地分配給標題行。XSLT +根據標題行的數據類型將Excel數據類型標記添加到單元格

XSLT:

<!-- match the Columns element and create header row --> 
<xsl:template match="Columns/*"> 
    <xsl:choose> 
     <xsl:when test="@Description[boolean(number()) or . = 0]"> 
      <ss:Cell ss:StyleID="1"> 
       <ss:Data ss:Type="Number"><xsl:apply-templates select="@Description"/></ss:Data> 
      </ss:Cell> 
      <xsl:call-template name="numberFormat"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <ss:Cell ss:StyleID="1"> 
       <ss:Data ss:Type="String"><xsl:apply-templates select="@Description"/></ss:Data> 
      </ss:Cell> 
      <xsl:call-template name="stringFormat"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template name="stringFormat" match="Row/*"> 
    <ss:Cell> 
    <ss:Data ss:Type="String"><xsl:apply-templates/></ss:Data> 
    </ss:Cell> 
</xsl:template> 

<xsl:template name="numberFormat" match="Row/*"> 
    <ss:Cell> 
    <ss:Data ss:Type="Number"><xsl:apply-templates/></ss:Data> 
    </ss:Cell> 
</xsl:template> 

結果:

 <ss:Row> 
      <ss:Cell ss:StyleID="1"> 
<ss:Data ss:Type="Number">2012001 (Number Header)</ss:Data> 
      </ss:Cell> 
      <ss:Cell ss:StyleID="1"> 
<ss:Data ss:Type="String">String Header</ss:Data> 
</ss:Cell> 
     </ss:Row> 
     <ss:Row> 
      <ss:Cell> 
<ss:Data ss:Type="Number">Row2Column1Data</ss:Data> 
      </ss:Cell> 
      <ss:Cell> 
<ss:Data ss:Type="Number">Row2Column2Data</ss:Data> 
      </ss:Cell> 
     </ss:Row> 
     <ss:Row> 
      <ss:Cell> 
<ss:Data ss:Type="Number">Row3Column1Data</ss:Data> 
      </ss:Cell> 
      <ss:Cell> 
<ss:Data ss:Type="Number">Row3Column2Data</ss:Data> 
      </ss:Cell> 
     </ss:Row> 

XML:

<Rowsets> 
<Rowset> 
    <Columns> 
     <Column Description="_2012001"/> 
     <Column Description="StringHeader"/> 
    </Columns> 
    <Row> 
     <_2012001>Row2Column1Data</_2012001> 
     <StringHeader>Row2Column2Data</StringHeader> 
    </Row> 
    <Row> 
     <_2012001>Row3Column1Data</_2012001> 
     <StringHeader>Row3Column2Data</StringHeader> 
    </Row> 
</Rowset> 
</Rowsets> 

目前,無論哪個模板是最後優先所以在這種情況下,我的「NUMBERFORMAT」模板是最後的ss:type設爲即使我明確地調用模板數...

更新: 所需的輸出

//First header cell contains a numeric value -- the cell should have ss:Type="Number" 
      <ss:Row> 
       <ss:Cell ss:StyleID="1"> 
    <ss:Data ss:Type="Number">_2012001 (Number Header)</ss:Data> 
       </ss:Cell> 
//Second header cell contains a string value -- the cell should have ss:Type="String" 
       <ss:Cell ss:StyleID="1"> 
    <ss:Data ss:Type="String">String Header</ss:Data> 
       </ss:Cell> 
      </ss:Row> 

//ss:Type="Number" for the first column because the header row of that column contains a number 
      <ss:Row> 
       <ss:Cell> 
    <ss:Data ss:Type="Number">Row2Column1Data</ss:Data> 
       </ss:Cell> 
//ss:Type="String" for the second column because the header row of that column is a String 
       <ss:Cell> 
    <ss:Data ss:Type="String">Row2Column2Data</ss:Data> 
       </ss:Cell> 
      </ss:Row> 
      <ss:Row> 
//ss:Type="Number" for the first column because the header row of that column contains a number 
       <ss:Cell> 
    <ss:Data ss:Type="Number">Row3Column1Data</ss:Data> 
       </ss:Cell> 
//ss:Type="String" for the second column because the header row of that column is a String 
       <ss:Cell> 
    <ss:Data ss:Type="String">Row3Column2Data</ss:Data> 
       </ss:Cell> 
      </ss:Row> 
    ...etc. 
+0

請編輯問題和specidy確切的通緝令。然後我會提供一個解決方案。 – 2012-02-16 02:15:55

+0

謝謝!我添加了我想要的輸出 – user1130511 2012-02-16 03:48:34

回答

1

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ss="some:ss" exclude-result-prefixes="ss"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <t xmlns:ss="some:ss"> 
    <xsl:apply-templates/> 
    </t> 
</xsl:template> 

<xsl:template match="Columns | Row"> 
    <ss:Row> 
    <xsl:apply-templates/> 
    </ss:Row> 
</xsl:template> 

<xsl:template priority="2" match= 
    "Column[floor(substring(@Description, 2)) 
     = 
      floor(substring(@Description, 2)) 
     ] 
    "> 
    <ss:Cell ss:StyleID="1"> 
    <ss:Data ss:Type="Number"> 
     <xsl:value-of select="@Description"/> 
    </ss:Data> 
    </ss:Cell> 
    </xsl:template> 

    <xsl:template match="Column"> 
    <ss:Cell ss:StyleID="1"> 
    <ss:Data ss:Type="String"> 
     <xsl:value-of select="@Description"/> 
    </ss:Data> 
    </ss:Cell> 
</xsl:template> 

<xsl:template priority="2" match= 
    "Row/*[floor(substring(name(), 2)) 
     = 
     floor(substring(name(), 2)) 
     ] 
    "> 
    <ss:Cell> 
    <ss:Data ss:Type="Number"> 
     <xsl:value-of select="."/> 
    </ss:Data> 
    </ss:Cell> 
</xsl:template> 

<xsl:template match="Row/*"> 
    <ss:Cell> 
    <ss:Data ss:Type="String"> 
     <xsl:value-of select="."/> 
    </ss:Data> 
    </ss:Cell> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔施加:

<Rowsets> 
    <Rowset> 
     <Columns> 
      <Column Description="_2012001"/> 
      <Column Description="StringHeader"/> 
     </Columns> 
     <Row> 
      <_2012001>Row2Column1Data</_2012001> 
      <StringHeader>Row2Column2Data</StringHeader> 
     </Row> 
     <Row> 
      <_2012001>Row3Column1Data</_2012001> 
      <StringHeader>Row3Column2Data</StringHeader> 
     </Row> 
    </Rowset> 
</Rowsets> 

產生想要的,正確的結果

<t> 
    <ss:Row xmlns:ss="some:ss"> 
     <ss:Cell ss:StyleID="1"> 
     <ss:Data ss:Type="Number">_2012001</ss:Data> 
     </ss:Cell> 
     <ss:Cell ss:StyleID="1"> 
     <ss:Data ss:Type="String">StringHeader</ss:Data> 
     </ss:Cell> 
    </ss:Row> 
    <ss:Row xmlns:ss="some:ss"> 
     <ss:Cell> 
     <ss:Data ss:Type="Number">Row2Column1Data</ss:Data> 
     </ss:Cell> 
     <ss:Cell> 
     <ss:Data ss:Type="String">Row2Column2Data</ss:Data> 
     </ss:Cell> 
    </ss:Row> 
    <ss:Row xmlns:ss="some:ss"> 
     <ss:Cell> 
     <ss:Data ss:Type="Number">Row3Column1Data</ss:Data> 
     </ss:Cell> 
     <ss:Cell> 
     <ss:Data ss:Type="String">Row3Column2Data</ss:Data> 
     </ss:Cell> 
    </ss:Row> 
</t> 

說明

  1. 正確噸模板和模式匹配。

  2. 使用floor($n) = floor($n)true()這一事實恰好在$n可轉換爲整數時。

+0

謝謝,完美的作品! – user1130511 2012-02-16 18:28:03

+0

@ user1130511:不客氣。 – 2012-02-16 20:08:54