Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
474 views
in Technique[技术] by (71.8m points)

xslt - XSL Taking XML transforming it into Excel

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 convert it easly, BUT with this XML file that had several nodes ( I think they are called), when I call up the data, its not right. I want to only show info from the check portion of XML and then show it in Excel in a way that shows the 6 or 7 columns that I want, then show the data. Heres what I have so far:

XML:

<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>

XSL File:

<xsl:stylesheet version="1.0"
    xmlns="urn:schemas-microsoft-com:office:spreadsheet"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:user="urn:my-scripts"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" >

  <xsl:template match="/">
    <Workbook 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:html="http://www.w3.org/TR/REC-html40">
      <xsl:apply-templates/>
    </Workbook>
  </xsl:template>


  <xsl:template match="/*">
    <Worksheet>
      <xsl:attribute name="ss:Name">
        <xsl:value-of select="local-name(/*/*)"/>
      </xsl:attribute>
      <Table x:FullColumns="1" x:FullRows="1">
        <Row>

          <xsl:for-each select="*[position() = 2]/*/checkItem/postingInfo/*">

            <Cell>
              <Data ss:Type="String">
                <xsl:value-of select="local-name()"/>
              </Data>
            </Cell>
          </xsl:for-each>
        </Row>
        <xsl:apply-templates/>
      </Table>
    </Worksheet>
  </xsl:template>


  <xsl:template match="/*/checkItem/postingInfo/*">
    <Row>
      <xsl:apply-templates/>
    </Row>
  </xsl:template>


  <xsl:template match="/*/checkItem/postingInfo/*">
    <Cell>
      <Data ss:Type="String">
        <xsl:value-of select="."/>
      </Data>
    </Cell>
  </xsl:template>


</xsl:stylesheet>

Does anyone have any Idea how I can get to JUSt the check portion f the XML file and have it format in an eay way??

Thanks

GabrielVA

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...