xslt 将数据库 xml 转换为 excel 表

Posted

技术标签:

【中文标题】xslt 将数据库 xml 转换为 excel 表【英文标题】:xslt to transform database xml into excel sheet 【发布时间】:2020-01-06 21:28:37 【问题描述】:

我有以下 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>

【问题讨论】:

从我的数据库中添加 xml 输出 【参考方案1】:

考虑以下简化示例:

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>

【讨论】:

以上是关于xslt 将数据库 xml 转换为 excel 表的主要内容,如果未能解决你的问题,请参考以下文章

在 node.js 中使用 XSLT 样式表将 xml 转换为 html

XSLT 将 FMPXMLRESULT xml 文档导出到 Excel

XSLT

XSLT学习通过JavaScript转化xml

是否有任何现成的 xslt 文件可以将 ODF 内容 xml 转换为纯文本?

如何将标题添加到由 XSLT 样式表转换的 HTML?