XML-XSL修改导出到Excel以设置文本/单元格数

时间:2018-06-27 23:01:00

标签: xml excel xslt

我正在尝试使用XSL文件修改XML文件以创建Excel电子表格-我的基本操作很好,但是我所有的单元格都在Excel中显示为文本单元格,但是我需要其中一些显示为数字,以便我们可以在Excel中对其正确执行计算。

这是我的XML:

<?xml version="1.0" encoding="utf-8"?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="02-13-2018" NAME="FileMaker" VERSION="ProAdvanced 16.0.5"/>
    <DATABASE DATEFORMAT="D/m/yyyy" LAYOUT="" NAME="Assets.fmp12" RECORDS="6" TIMEFORMAT="h:mm:ss a"/>
    <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Code" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Country" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Price" TYPE="NUMBER"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Tax" TYPE="NUMBER"/>
    </METADATA>
    <RESULTSET FOUND="2">
        <ROW MODID="0" RECORDID="23">
            <COL>
                <DATA>CH56809</DATA>
            </COL>
            <COL>
                <DATA>Australia</DATA>
            </COL>
            <COL>
                <DATA>1024.64</DATA>
            </COL>
            <COL>
                <DATA>68.45</DATA>
            </COL>
        </ROW>
        <ROW MODID="0" RECORDID="24">
            <COL>
                <DATA>PZ30844</DATA>
            </COL>
            <COL>
                <DATA>Australia</DATA>
            </COL>
            <COL>
                <DATA>2014.64</DATA>
            </COL>
            <COL>
                <DATA>116.5</DATA>
            </COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>

您可以在METADATA部分中看到它标识每个字段是文本字段还是数字字段:

<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Country" TYPE="TEXT"/>
<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Price" TYPE="NUMBER"/>

所以我们应该能够使用它来将单元格设置为多个文本。

我不确定此处的语法是否正确-我相信我们只需要修改此位:

<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
        <Row>
            <!-- Next line inserts an empty column on the left side of the sheet -->
            <!-- This is simply a personal preference of mine :) -->
            <xsl:for-each select="fmp:COL">
                <xsl:variable name="i" select="position()" />
                <Cell ss:StyleID="MyTextStyle1">
                    <Data ss:Type="String">
                        <xsl:value-of select="." />
                    </Data>
                </Cell>
            </xsl:for-each><!-- next column -->
        </Row>
</xsl:for-each><!-- next row -->

,但不确定在创建单元格时如何将此因素考虑为此处的字段类型。我正在使用:

 <xsl:stylesheet version="1.0"

1 个答案:

答案 0 :(得分:0)

假设您已经正确设置了名称空间;将代码段更改为以下内容:

<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">
    <Row>
        <!-- Next line inserts an empty column on the left side of the sheet -->
        <!-- This is simply a personal preference of mine :) -->
        <xsl:for-each select="fmp:COL">
            <xsl:variable name="i" select="position()" />
            <xsl:variable name="t" select="/fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD[$i]/@TYPE" />
            <xsl:variable name="type">
                <xsl:choose>
                    <xsl:when test="$t='TEXT'">
                        <xsl:value-of select="'String'" />
                    </xsl:when>
                    <xsl:when test="$t='NUMBER'">
                        <xsl:value-of select="'Number'" />
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:message terminate="yes">Unknown Type</xsl:message>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>

            <Cell ss:StyleID="MyTextStyle1">
                <Data ss:Type="{$type}">
                    <xsl:value-of select="." />
                </Data>
            </Cell>
        </xsl:for-each><!-- next column -->
    </Row>
</xsl:for-each><!-- next row -->

这根据String中的定义处理Numberfmp:METADATA这两种类型,并将其设置在属性值模板ss:Type="{$type}"中。未知类型会停止处理并引发错误。