Bef: Folgendes performanter möglich?

Beitrag lesen

Hallo,

Ich möchte, vereinfacht gesagt, aus XML-Daten mit folgendem Aufbau eine Tabelle mit Tabellen-, Zeilen- und Spaltentags (ähnlich wie bei HTML) machen. Nicht alle Tabellen in der Quelldatei haben immer den gleichen Namen, das muss also auch irgendwie dynamisch behandelt werden.

Format der Quelldatei:
<NewDataSet>
 <Tabelle1>Cells ... </Tabelle1>
 <Tabelle1>Cells ... </Tabelle1>
 <Tabelle1>Cells ... </Tabelle1>
 <Tabelle2>Cells ... </Tabelle2>
 <Tabelle2>Cells ... </Tabelle2>
 <Tabelle3>Cells ... </Tabelle3>
 ...
</NewDataSet>

Hier ist mein aktuelles XSLT-Script. Es funktioniert zwar, ist aber meiner Meinung nach eher unschön und vermutlich performancemässig nicht optimal.

<xsl:stylesheet version="1.0"
 xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
  <xsl:key name="Tables" match="/NewDataSet/*" use="local-name(.)" />
  <xsl:template match="/">
    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
      xmlns:x="urn:schemas-microsoft-com:office:excel"
      xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
      <Styles>
        <Style ss:ID="s21">
          <NumberFormat ss:Format="0"/>
        </Style>
      </Styles>
      <xsl:for-each select="/NewDataSet/*[not(local-name() = local-name(./following-sibling::*[1]))]">
        <xsl:variable name="tablename" select="local-name()" />
        <xsl:if test="$tablename != 'zusatz_report'">
          <Worksheet ss:Name="{$tablename}">
            <Table x:FullColumns="1" x:FullRows="1">
              <Row>
                <xsl:for-each select="key('Tables', $tablename)[position() = 1]/*">
                  <Cell>
                    <Data ss:Type="String">
                      <xsl:value-of select="translate(local-name(.),'_',' ')"/>
                    </Data>
                  </Cell>
                </xsl:for-each>
              </Row>
              <xsl:apply-templates select="key('Tables', $tablename)"/>
              <xsl:if test="contains($tablename, 'Report')">
                <Row>
                  <Cell>
                    <Data ss:Type="String"> </Data>
                  </Cell>
                </Row>
                <Row>
                  <Cell>
                    <Data ss:Type="String">Transfer</Data>
                  </Cell>
                  <xsl:apply-templates select="/NewDataSet/zusatz_report/Transfer"></xsl:apply-templates>
                </Row>
                <Row>
                  <Cell>
                    <Data ss:Type="String">Zusaetzliche Aufbewahrung</Data>
                  </Cell>
                  <xsl:apply-templates select="/NewDataSet/zusatz_report/Zusaetzliche_Aufbewahrung"></xsl:apply-templates>
                </Row>
              </xsl:if>
            </Table>
          </Worksheet>
        </xsl:if>
      </xsl:for-each>
    </Workbook>

</xsl:template>
  <xsl:template match="/NewDataSet/*">
    <Row>
      xsl:apply-templates/
    </Row>
  </xsl:template>
  <xsl:template match="Gesicherte_Bytes | GB | Summe_diesen_Monat | Jahr | Januar | Februar | Maerz | April | May | Juni | Juli | August | September | Oktober | November | Dezember | Transfer | Zusaetzliche_Aufbewahrung">
    <Cell ss:StyleID="s21">
      <Data ss:Type="Number">
        <xsl:value-of select="."/>
      </Data>
    </Cell>
  </xsl:template>
  <xsl:template match="MASTERSERVER | SICHERUNGSTYP | F7 | HALTEFRIST | JOBID | F15 | F16 | F17 | F18 | F19 | Haltezeit | SummeMonat">
    <Cell>
      <Data ss:Type="Number">
        <xsl:value-of select="."/>
      </Data>
    </Cell>
  </xsl:template>
  <xsl:template match="STARTSICHERUNG | ENDESICHERUNG | MASTERSERVER |SICHERUNGSTYP | NETBACKUPCLIENT | SICHERUNGSART | MEDIASERVER | POLICY | SCHEDULE | LAUFWERK">
    <Cell>
      <Data ss:Type="String">
        <xsl:value-of select="."/>
      </Data>
    </Cell>
  </xsl:template>
</xsl:stylesheet>

Hat jemand einen Tipp, wie ich das verbessern könnte?
Ich wäre wirklich sehr dankbar, mir Fehlt nämlich die Erfahrung mit XSLT und meine bisherigen Versuche bestanden leider zu einem Grossteil aus Ausprobieren.