我正在尝试使用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"
答案 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
中的定义处理Number
和fmp:METADATA
这两种类型,并将其设置在属性值模板ss:Type="{$type}"
中。未知类型会停止处理并引发错误。