Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

XSLT1: "Gruppieren"

Yves3 / 2 Antworten / Baumansicht Nickles

Hallo,

Ich habe ein Dokument, das verschiedene Tabellen mit Datensätzen enthält und möchte dieses in ein anderes Format übertragen.

Das Eingangsformat sieht grob so aus:
<dataset>
<Table1>
<col1>Wert a</col1>
<col2>Wert b</col2>
<col3>Wert c</col3>
</Table1>
<Table1>
<col1>Wert d</col1>
<col2>Wert e</col2>
<col3>Wert f</col2>
</Table1>
<Tabelle2>
<col1>Wert g</col1>
<col2>Wert h</col2>
</Tabelle2>
</dataset>

Das Problem das ich mit diesem Format habe ist, dass Tabellen und Rows sozusagen in einem einzigen Tag ausgedrückt werden und nicht in zwei.
So ist es nämlich im Ausgangsformat:

<Worksheet>
<table>
<row>
<cell></cell>
</row>
<table>
</Worksheet>

Ich muss jetzt sozusagen pro Gruppe gleichnamiger Childelemente von Dataset jeweils einmal die XML-Tags Worksheet und table ausgeben.
Wie kann ich so eine Gruppe "matchen"? Oder muss ich das anders angehen?
Ich kann übrigens nicht XSLT2.0 verwenden, es muss also irgendwie mit 1.0 lösbar sein.

Kann mir jemand helfen?

bei Antwort benachrichtigen
Yves3 Nachtrag zu: „XSLT1: "Gruppieren"“
Optionen

Ich hab's jetzt einfach "hardcodiert", falls man das so nennen kann. Es wäre schon nett gewesen, wenn dynamisch pro Tabelle ein Worksheet erzeugt worden wäre, aber das ist es nicht wert noch Stunden oder Tage zu suchen und zu frickeln.

Hier meine aktuelle Lösung:

<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="" target="_blank" rel="nofollow">http://www.w3.org/TR/REC-html40">      
      <Styles>
        <Style ss:ID="s21">
          <NumberFormat ss:Format="0"/>
        </Style>
      </Styles>
      <Worksheet ss:Name="Table">
        <Table x:FullColumns="1" x:FullRows="1">
         <Row>
          <xsl:for-each select="/*/Table[position() = 1]/*">
            <Cell>
              <Data ss:Type="String">
                <xsl:value-of select="local-name()"/>
              </Data>
            </Cell>
          </xsl:for-each>
         </Row>
         <xsl:apply-templates select="/*/Table"/>           
        </Table>
      </Worksheet>
      <Worksheet ss:Name="Compilation">
        <Table x:FullColumns="1" x:FullRows="1">
          <Row>
            <xsl:for-each select="/*/Compilation[position() = 1]/*">
              <Cell>
                <Data ss:Type="String">
                  <xsl:value-of select="local-name()"/>
                </Data>
              </Cell>
            </xsl:for-each>
          </Row>
          <xsl:apply-templates select="/*/Compilation"/>
        </Table>
      </Worksheet>
    </Workbook>
  </xsl:template>
  <xsl:template match="/*/*">
    <Row>
      <xsl:apply-templates/>
    </Row>
  </xsl:template>
  <xsl:template match="GESICHERTEGB">
    <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>



bei Antwort benachrichtigen
Yves3 Nachtrag zu: „Ich hab s jetzt einfach hardcodiert , falls man das so nennen kann. Es wäre...“
Optionen

Ich habe heute noch einmal eine Weile herumprobiert und schliesslich doch noch eine dynamische Lösung gefunden :)

<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:key name="Tables" match="/*/*" use="local-name(.)" />
  <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="" target="_blank" rel="nofollow">http://www.w3.org/TR/REC-html40">      
      <Styles>
        <Style ss:ID="s21">
          <NumberFormat ss:Format="0"/>
        </Style>
      </Styles>
      <xsl:for-each select="/*/*[not(local-name() = local-name(./following-sibling::*))]">
        <xsl:variable name="tablename" select="local-name()" />
        <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="local-name(.)"/>
                  </Data>
                </Cell>
                </xsl:for-each>
              </Row>
            <xsl:apply-templates select="key('Tables', $tablename)"/>
          </Table>
        </Worksheet>
      </xsl:for-each>
    </Workbook>
  </xsl:template>
  <xsl:template match="/*/*">
    <Row>
      <xsl:apply-templates/>
    </Row>
  </xsl:template>
  <xsl:template match="GESICHERTEGB">
    <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>

bei Antwort benachrichtigen