2016-06-03 12 views
0

Ich muss das Ergebnis einer Abfrage (XML-Format) in eine Excel-Datei transformieren.XSLT-Transformation nach Excel

Beispiel der Abfrage-Ergebnis:

<?xml version="1.0" encoding="UTF-8"?> 
<dbqueries> 
<dbquery id="main"> 
    <rows> 
     <row user="Me" user-id="1"/> 
     <row user="Myself" user-id="2"/> 
     <row user="I" user-id="3"/> 
    </rows> 
</dbquery> 
</dbqueries> 

Ich benutze das folgende XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<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"> 
<xsl:output method="xml" indent="yes" encoding="UTF-8" /> 
<xsl:template match="/dbqueries"> 
    <xsl:processing-instruction name="mso-application"> 
     <xsl:text>progid="Excel.Sheet"</xsl:text> 
    </xsl:processing-instruction> 

    <Workbook> 
     <Styles> 
      <Style ss:ID="Default" ss:Name="Normal"> 
       <Alignment ss:Vertical="Bottom" /> 
       <Borders /> 
       <Font /> 
       <Interior /> 
       <NumberFormat /> 
       <Protection /> 
      </Style> 
      <Style ss:ID="s21"> 
       <Font ss:Size="22" ss:Bold="1" /> 
      </Style> 
      <Style ss:ID="s22"> 
       <Font ss:Size="14" ss:Bold="1" /> 
      </Style> 
      <Style ss:ID="s23"> 
       <Font ss:Size="12" ss:Bold="1" /> 
      </Style> 
      <Style ss:ID="s24"> 
       <Font ss:Size="10" ss:Bold="1" /> 
      </Style> 
     </Styles> 
     <!-- Write each query --> 
     <xsl:for-each select="dbquery"> 
      <Worksheet ss:Name="{@id}"> 
       <Table> 
        <xsl:apply-templates select="//rows" mode="rows" /> 
       </Table> 
      </Worksheet> 
     </xsl:for-each> 
    </Workbook> 
</xsl:template> 
<xsl:template match="//rows/row" mode="rows"> 
    <xsl:variable name="x" select="position()" /> 
    <Row ss:Index="{$x}"> 
     <Cell ss:Index="1"> 
      <Data ss:Type="String"> 
       <xsl:value-of select="@id" /> 
      </Data> 
     </Cell> 
     <Cell ss:Index="2"> 
      <Data ss:Type="String"> 
       <xsl:value-of select="@user" /> 
      </Data> 
     </Cell> 
    </Row> 
</xsl:template> 

Die Umwandlung funktioniert, außer dass das erste Zeichen bei der Konvertierung verloren.

Siehe unten:

Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 

Was falsch möglicherweise wird?

+0

Was * erstes Zeichen *? Der Öffnungswinkel? Kein XSLT-Prozessor würde das jemals tun. Könnte helfen, aktuelle und gewünschte Ausgabe zu zeigen. – Parfait

+0

Das Zeichen "<", das der Arbeitsmappe vorausgeht, ist verloren – Soldierflup

+1

Welchen XSLT-Prozessor verwenden Sie? VBAs MSXML? Xalan? Saxon? LibXSLT? – Parfait

Antwort

1

Die Frage kann geschlossen werden. Die Lösung des Problems war die Tatsache, dass ich im verwendeten Framework eine Art von Ergebnis "application/vnd.ms-excel" stellen musste und stattdessen "text/xml" fragte.

0

Ich empfehle, dass Sie eine Umwandlung in HTML verwenden und verwenden Sie Datatables (https://datatables.net/), um eine html5 "output to Excel" -Taste zu erstellen. Es wird wahrscheinlich viel einfacher sein, das gewünschte Ergebnis zu erhalten.