首页 > 解决方案 > xslt 将数据库 xml 转换为 excel 表

问题描述

我有以下 xslt 样式表,它从我的数据库中获取输出并将其转换为格式化的 excel 文件。

我想做的最后一个想法是尝试让它在以下条件下将 a 列与 b 列(两者都是数字)进行比较:

if col a > b then use the stylesheet s22
if col a < b then use the stylesheet s23
if col a = b then use the stylesheet s24

谁能帮我把这个放在一起。

我知道您需要使用测试条件,有一个 if 或 when 但我找不到太多关于如何使用我拥有的数据类型执行此操作的示例。

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<xsl:stylesheet version="1.0"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:fmp="http://www.filemaker.com/fmpxmlresult" exclude-result-prefixes="fmp">


<xsl:template match="/">

Workbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom" />
<Borders />
<Font />
<Interior />
<NumberFormat />
<Protection />
</Style>
<Style ss:ID="s21">
<Font ss:Size="12" ss:Bold="1" />
<Interior ss:Color="#0084D1" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s22">
<Font ss:Size="12" ss:Color="#db0f0f" ss:Bold="0" />
</Style>
<Style ss:ID="s23">
<Font ss:Size="12" ss:Color="#509e0a" ss:Bold="0" />
</Style>
<Style ss:ID="s24">
<Font ss:Size="12" ss:Color="#dddddd" ss:Bold="0" />
</Style>
</Styles>

<Worksheet ss:Name="Page1">
<Table>
<xsl:call-template name="XMLToXSL" />
</Table>

<!-- ADD WORKSHEET OPTIONS TO FREEZEPANES -->
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageLayoutZoom>0</PageLayoutZoom>
<Selected/>
<FreezePanes/>
<FrozenNoSplit/>
<SplitHorizontal>1</SplitHorizontal>
<TopRowBottomPane>1</TopRowBottomPane>
<ActivePane>2</ActivePane>
<Panes>
<Pane>
 <Number>3</Number>
</Pane>
<Pane>
 <Number>2</Number>
 <RangeSelection>R2</RangeSelection>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>

</xsl:template>

<xsl:template name="XMLToXSL">

<Row>
<xsl:for-each select="fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD">
<Cell ss:StyleID="s21">
<Data ss:Type="String">
<xsl:value-of select="@NAME"/>
</Data>
</Cell>
</xsl:for-each>
</Row>

<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
<Row>
<xsl:for-each select="fmp:COL/.">
<Cell ss:StyleID="s22">
<Data ss:Type="String">
<xsl:value-of select="." />
</Data>
</Cell>
</xsl:for-each>
</Row>
</xsl:for-each>
</xsl:template>
<xsl:template match="fmp:FMPXMLRESULT">
</xsl:template>
</xsl:stylesheet>

我的原始 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<ERRORCODE>0</ERRORCODE>
<PRODUCT BUILD="05-10-2014" NAME="FileMaker" VERSION="ProAdvanced 13.0.0" />
<DATABASE DATEFORMAT="D/m/yyyy" LAYOUT="" NAME="test.fmp12" RECORDS="3" TIMEFORMAT="k:mm:ss " />
<METADATA>
  <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="YrA" TYPE="NUMBER" />
  <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="YrB" TYPE="NUMBER" />
  <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="FirstName" TYPE="TEXT" />
  <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="LastName" TYPE="TEXT" />
</METADATA>
<RESULTSET FOUND="3">
  <ROW MODID="1" RECORDID="1">
     <COL>
        <DATA>3</DATA>
     </COL>
     <COL>
        <DATA>2</DATA>
     </COL>
     <COL>
        <DATA>George</DATA>
     </COL>
     <COL>
        <DATA>McCraft</DATA>
     </COL>
  </ROW>
  <ROW MODID="0" RECORDID="2">
     <COL>
        <DATA>3</DATA>
     </COL>
     <COL>
        <DATA>3</DATA>
     </COL>
     <COL>
        <DATA>Mike</DATA>
     </COL>
     <COL>
        <DATA>Rodgers</DATA>
     </COL>
  </ROW>
  <ROW MODID="1" RECORDID="3">
     <COL>
        <DATA>2</DATA>
     </COL>
     <COL>
        <DATA>5</DATA>
     </COL>
     <COL>
        <DATA>Craig</DATA>
     </COL>
     <COL>
        <DATA>Michael</DATA>
     </COL>
  </ROW>
 </RESULTSET>
 </FMPXMLRESULT>

标签: excelxmlxslt

解决方案


考虑以下简化示例:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
exclude-result-prefixes="fmp">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/fmp:FMPXMLRESULT">
    <xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet">
        <!-- STYLES --> 
        <Styles>
            <Style ss:ID="s22">
                <Font ss:Size="12" ss:Color="#db0f0f" ss:Bold="0" />
            </Style>
            <Style ss:ID="s23">
                <Font ss:Size="12" ss:Color="#509e0a" ss:Bold="0" />
            </Style>
            <Style ss:ID="s24">
                <Font ss:Size="12" ss:Color="#dddddd" ss:Bold="0" />
            </Style>        
        </Styles>
        <!-- WORKSHEET -->      
        <Worksheet ss:Name="Worksheet1">
            <Table>
                <!-- HEADER ROW (omitted) -->
                <!-- DATA ROWS -->
                <xsl:for-each select="fmp:RESULTSET/fmp:ROW">
                    <Row>
                        <xsl:variable name="style">
                            <xsl:choose>
                                <xsl:when test="fmp:COL[1]/fmp:DATA > fmp:COL[2]/fmp:DATA">s22</xsl:when>
                                <xsl:when test="fmp:COL[2]/fmp:DATA > fmp:COL[1]/fmp:DATA">s23</xsl:when>
                                <xsl:otherwise>s24</xsl:otherwise>
                            </xsl:choose>
                        </xsl:variable>
                        <xsl:for-each select="fmp:COL">
                            <Cell ss:StyleID="{$style}">
                                <Data ss:Type="String">
                                    <xsl:value-of select="fmp:DATA"/>
                                </Data>
                            </Cell>
                        </xsl:for-each>
                    </Row>
                </xsl:for-each>
            </Table>
        </Worksheet>
    </Workbook>
</xsl:template>

</xsl:stylesheet>

推荐阅读