XSL Taking XML transforming it into Excel

后端 未结 1 797
一向
一向 2020-12-17 22:25

New guy here so bear with me. Ive got a basic XSL file that will read my xml data. Im trying to put xml into Excel. Heres my issue. With a small XML file it seems to conver

相关标签:
1条回答
  • 2020-12-17 22:56

    I think you need this stylesheet:

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="urn:schemas-microsoft-com:office:spreadsheet"
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
    xmlns:x="urn:schemas-microsoft-com:office:excel">
        <xsl:template match="/">
            <xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
            <Workbook>
                <xsl:apply-templates/>
            </Workbook>
        </xsl:template>
        <xsl:template match="/*">
            <Worksheet ss:Name="{*/*/*[local-name()='docDescription']}">
                <Table x:FullColumns="1" x:FullRows="1">
                    <Row>
                        <xsl:for-each select="*/*/*[local-name()='checkItem'][1]//*[not(*)]">
                            <Cell>
                                <Data ss:Type="String">
                                    <xsl:value-of select="local-name()"/>
                                </Data>
                            </Cell>
                        </xsl:for-each>
                    </Row>
                    <xsl:apply-templates select="*/*/*[local-name()='checkItem']"/>
                </Table>
            </Worksheet>
        </xsl:template>
        <xsl:template match="*[local-name()='checkItem']" priority="1">
            <Row>
                <xsl:apply-templates select=".//*[not(*)]"/>
            </Row>
        </xsl:template>
        <xsl:template match="*[not(*)]">
            <Cell>
                <Data ss:Type="String">
                    <xsl:value-of select="."/>
                </Data>
            </Cell>
        </xsl:template>
    </xsl:stylesheet>
    

    With this input (proper well formed):

    <bdiData>
        <documentControlInfo>
            <documentInfo>
                <docDescription>Checks for Company X</docDescription>
                <docID>
                    <ID>123456789</ID>
                </docID>
                <docModifier>My Company</docModifier>
                <docCreateDate>2010-08-23</docCreateDate>
                <docCreateTime>07:08:54-0700</docCreateTime>
                <standardVersion>1.0</standardVersion>
                <testIndicator>0</testIndicator>
                <resendIndicator>0</resendIndicator>
            </documentInfo>
            <sourceInfo>
                <sourceName>My Banking Name</sourceName>
                <sourceID>
                    <idOther>ShortBankName</idOther>
                </sourceID>
            </sourceInfo>
            <destinationInfo>
                <destinationName>My Company</destinationName>
                <destinationID>
                    <idOther>MYCO</idOther>
                </destinationID>
            </destinationInfo>
        </documentControlInfo>
        <checkItemCollection>
            <collectionInfo>
                <description>Items</description>
                <ID>654811650</ID>
                <Classification>
                    <classification>Items</classification>
                </Classification>
            </collectionInfo>
            <checkItemBatch>
                <checkItemBatchInfo>
                    <description>Paid Checks</description>
                    <ID>1239668334710</ID>
                    <Classification>
                        <classification>Paid Checks</classification>
                    </Classification>
                </checkItemBatchInfo>
                <checkItem>
                    <checkItemType>check</checkItemType>
                    <checkAmount>2960</checkAmount>
                    <postingInfo>
                        <date>2009-06-12</date>
                        <RT>87654321</RT>
                        <accountNumber>123465798</accountNumber>
                        <seqNum>007725552898</seqNum>
                        <trancode>001152</trancode>
                        <amount>2960</amount>
                        <serialNumber>55225410</serialNumber>
                    </postingInfo>
                </checkItem>
            </checkItemBatch>
        </checkItemCollection>
    </bdiData>
    

    Output:

    <?mso-application progid="Excel.Sheet"?>
    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel">
        <Worksheet ss:Name="Checks for Company X">
            <Table x:FullColumns="1" x:FullRows="1">
                <Row>
                    <Cell>
                        <Data ss:Type="String">checkItemType</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">checkAmount</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">date</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">RT</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">accountNumber</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">seqNum</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">trancode</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">amount</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">serialNumber</Data>
                    </Cell>
                </Row>
                <Row>
                    <Cell>
                        <Data ss:Type="String">check</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">2960</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">2009-06-12</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">87654321</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">123465798</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">007725552898</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">001152</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">2960</Data>
                    </Cell>
                    <Cell>
                        <Data ss:Type="String">55225410</Data>
                    </Cell>
                </Row>
            </Table>
        </Worksheet>
    </Workbook>
    

    Wich is properly open by Excel.

    Note: those fn:local-name() are there because your input sample is unreliable.

    0 讨论(0)
提交回复
热议问题