【问题标题】:XML Export to Excel via XSLT - Add Bold Formatting通过 XSLT 将 XML 导出到 Excel - 添加粗体格式
【发布时间】:2017-08-15 05:54:50
【问题描述】:

我正在使用 XSLT 文件从一些 XML 数据生成 .xls Excel 文件 - 这运行良好并生成有效的 XLS 文件。

我现在需要扩展它以使某些单元格变为粗体。这是我的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="06-06-2017" NAME="FileMaker" VERSION="ProAdvanced 16.0.2"/>
    <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ColumnA" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ColumnB" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ColumnC" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ColumnD" TYPE="TEXT"/>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="ColumnE" TYPE="TEXT"/>
    </METADATA>
    <RESULTSET FOUND="6">
        <ROW MODID="0" RECORDID="900">
            <COL>
                <DATA>Created: 15-August-2017</DATA>
            </COL>
            <COL>
                <DATA/>
            </COL>
            <COL>
                <DATA/>
            </COL>
            <COL>
                <DATA/>
            </COL>
            <COL>
                <DATA/>
            </COL>
        </ROW>
        <ROW MODID="0" RECORDID="901">
            <COL>
                <DATA/>
            </COL>
            <COL>
                <DATA/>
            </COL>
            <COL>
                <DATA/>
            </COL>
            <COL>
                <DATA/>
            </COL>
            <COL>
                <DATA/>
            </COL>
        </ROW>
        <ROW MODID="1" RECORDID="902">
            <COL>
                <DATA>Name</DATA>
            </COL>
            <COL>
                <DATA>ID</DATA>
            </COL>
            <COL>
                <DATA>Category</DATA>
            </COL>
            <COL>
                <DATA>Number</DATA>
            </COL>
            <COL>
                <DATA>Amount</DATA>
            </COL>
        </ROW>
        <ROW MODID="1" RECORDID="904">
            <COL>
                <DATA>Acme Corp Pty Ltd</DATA>
            </COL>
            <COL>
                <DATA>123456</DATA>
            </COL>
            <COL>
                <DATA>Category 1</DATA>
            </COL>
            <COL>
                <DATA>1</DATA>
            </COL>
            <COL>
                <DATA>$456.78</DATA>
            </COL>
        </ROW>
        <ROW MODID="1" RECORDID="905">
            <COL>
                <DATA>Demo Company Pty Ltd</DATA>
            </COL>
            <COL>
                <DATA>987654</DATA>
            </COL>
            <COL>
                <DATA>Category 2</DATA>
            </COL>
            <COL>
                <DATA>1</DATA>
            </COL>
            <COL>
                <DATA>$789.32</DATA>
            </COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>

我希望为该行分配粗体属性:

<ROW MODID="1" RECORDID="902">
            <COL>
                <DATA>Name</DATA>
            </COL>
            <COL>
                <DATA>ID</DATA>
            </COL>
            <COL>
                <DATA>Category</DATA>
            </COL>
            <COL>
                <DATA>Number</DATA>
            </COL>
            <COL>
                <DATA>Amount</DATA>
            </COL>
        </ROW>

但不确定如何在我的 XSLT 文件中执行此操作。

XSLT 中处理行的部分如下:

<Style ss:ID="MyTitleStyle">
            <Alignment ss:WrapText="0" />
            <Font  ss:Bold="1"/>
        </Style>

<xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">

        <Row>
            <xsl:for-each select="fmp:COL">
                <xsl:variable name="i" select="position()" />
                <xsl:variable name="zFieldName" select="/fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD[$i]/@NAME" />
                <xsl:variable name="zFieldType" select="/fmp:FMPXMLRESULT/fmp:METADATA/fmp:FIELD[$i]/@TYPE" />
                <!-- We are looping through rows and columns, and now we can examine the cell -->
                <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 -->

【问题讨论】:

  • “这一行”到底是什么意思?你想通过什么属性来识别行? --附言看起来您的表中有虚拟记录,这是不好的做法。
  • @michael.hor257k 抱歉,这些列在 Excel 中变成了单个“行”。这是我希望加粗的“行”——这 5 个 元素(Excel 中的列标题)。
  • 我的问题仍然存在:哪 5 个 元素应该成为 Excel 中的列标题?它会一直是第 3 行(就像在您的示例中一样)还是可以改变?
  • 名称 ID 类别 数量 数量

标签: xml excel xslt


【解决方案1】:

这是一个经过修改的 for-each。目前还不清楚您要如何识别“粗体”行。此示例假定标题是包含“名称”的行和列

<?xml version="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"
>
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
<xml 
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
    xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
>
<xsl:element name='Table'>
    <xsl:for-each select="//fmp:ROW">
        <Row>
        <!-- If we have a cell with "Name", then consider it the header -->
        <xsl:variable name='header' select='fmp:COL[fmp:DATA="Name"]'/>
        <xsl:for-each select="fmp:COL">
        <Cell>
            <xsl:if test='$header'>
                <xsl:attribute name='ss:StyleID'>MyTextStyle1</xsl:attribute>
            </xsl:if>
            <Data ss:Type="String">
                <xsl:value-of select="." />
            </Data>
           </Cell>
        </xsl:for-each><!-- next column -->
        </Row>
    </xsl:for-each><!-- next row -->
</xsl:element>
</xml>

</xsl:template>

</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多