Announcement

Collapse
No announcement yet.

Einsteiger Problem XSL mit Excel xml

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Einsteiger Problem XSL mit Excel xml

    Hallo,

    ich bin blutiger Anfänger in dem Thema und habe daher vermutlich ein triviales Problem:
    Excel bietet den Export als "XML-Kalkulationstabelle" im xml Format an. Bei meiner Test Tabelle bekomme ich (Ausschnitt, der relevant ist):
    <Worksheet ss:Name="Tabelle1">
    <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="3" x:FullColumns="1"
    x:FullRows="1" ssefaultColumnWidth="60" ssefaultRowHeight="15">
    <Row>
    <Cell><Data ss:Type="String">Name</Data></Cell>
    <Cell><Data ss:Type="String">Wert</Data></Cell>
    </Row>
    <Row>
    <Cell><Data ss:Type="String">Hugo</Data></Cell>
    <Cell><Data ss:Type="Number">10</Data></Cell>
    </Row>
    <Row>
    <Cell><Data ss:Type="String">Egon</Data></Cell>
    <Cell><Data ss:Type="Number">20</Data></Cell>
    </Row>
    </Table>

    Ich möchte jetzt "einfach" per xsl Transformation folgendes erhalten
    <row_description>
    <table_description visible="true">Tableheader</table_description>
    <name>Tablename</name>
    <column visible="true">
    <id>1</id>
    <name>name</name>
    <type>string</type>
    </column>
    </row_description>
    Die ID soll den nummerischen Wert der betreffenden Zeile (also, 1,2 bzw. 3 erhalten)
    In <name> soll der Wert aus Spalte 1 der betreffenden Zeile übernommen werden (also "Name" für zeile 1 etc.)
    In <type> soll der Wert aus Spalte 2 der betreffenden Zeile übernommen werden (also z.B. "20" für Zeile 3 etc.)

    Ich habe schon einiges versucht in Cooktop, aber bekomme es nicht hin...
    Wäre toll, wenn sich jemand erbarmen würde und mir auf die Sprünge hilft.

  • #2
    Bezogen auf XSLT 1.0 sollte das gesuchte Ergebnis so entstehen:
    [Highlight=XML]<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ss="urn:schemas-microsoft-comffice:spreadsheet"
    xmlns:x="urn:schemas-microsoft-comffice:excel"
    xmlns:ws="urn:schemas-microsoft-comffice:spreadsheet"
    exclude-result-prefixes="#all">

    <xsl:template match="ws:Workbook">
    <output>
    <xsl:apply-templates select="ws:Worksheet/ws:Table"/>
    </output>
    </xsl:template>

    <xsl:template match="ws:Table">
    <row_description>
    <table_description visible="true">Tableheader</table_description>
    <name><xsl:value-of select="../@ss:Name"/></name>
    <xsl:apply-templates select="ws:Row"/>
    </row_description>
    </xsl:template>

    <xsl:template match="ws:Row">
    <column visible="true">
    <id><xsl:value-of select="position()"/></id>
    <name><xsl:value-of select="ws:Cell[1]/wsata"/></name>
    <type><xsl:value-of select="ws:Cell[2]/wsata"/></type>
    </column>
    </xsl:template>

    </xsl:stylesheet>[/Highlight]

    Erhaltenes Ergebnis:
    [Highlight=XML]<?xml version="1.0" encoding="UTF-8"?>
    <output>
    <row_description>
    <table_description visible="true">Tableheader</table_description>
    <name>Tabelle1</name>
    <column visible="true">
    <id>1</id>
    <name>Name</name>
    <type>Wert</type>
    </column>
    <column visible="true">
    <id>2</id>
    <name>Hugo</name>
    <type>10</type>
    </column>
    <column visible="true">
    <id>3</id>
    <name>Egon</name>
    <type>20</type>
    </column>
    </row_description>
    </output>[/Highlight]

    Unter XSLT 2.0 ließe sich die Angabe von "ws:" sparen, wenn xpath-default-namespace="urn:schemas-microsoft-comffice:spreadsheet" bei xsl:stylesheet gesetzt wird.

    Hinweis: Bitte beim Posten "Grafische Smileys deaktivieren", sonst gehen Codeteile beim Übertragen kaputt.
    Zuletzt editiert von Thomas Meinike; 07.02.2014, 16:17.

    Comment


    • #3
      Das hat mir sehr weitergeholfen. Danke!
      Was wird mit "exclude-result-prefixes="#all"" bewirkt?
      Wenn ich die Zeile drinnen lasse bekomme ich eine namespace fehlermeldung: "ERROR: Description: '#all' is not a valid namespace prefix value."
      Ohne die Zeile scheint es aber korrekt zu laufen?

      Comment


      • #4
        exclude-result-prefixes="#all" ist eine Technik aus XSLT 2.0 zur Entfernung aller im Ausgabedokument nicht benötigten Namensräume. Für 1.0 alternativ einzeln angeben: exclude-result-prefixes="ss x ws".

        Comment


        • #5
          <id><xsl:value-of select="position()"/></id>
          <name><xsl:value-of select="ws:Cell[1]/wsata"/></name>
          <type><xsl:value-of select="ws:Cell[2]/wsata"/></type>

          Gibt es eine Möglichkeit die "Position" an "Cell" zu übergeben?
          Also praktisch:
          <name><xsl:value-of select="ws:Cell[1]/wsata"/></name> mit
          <name><xsl:value-of select="ws:Cell[Position()]/wsata"/></name>

          Sprich der aktuelle Wert von "ID" soll als Position in Cell verwendet werden

          Wie übergebe ich eine Variable korrekt im XPath?

          Comment


          • #6
            Hinweis: Bitte beim Posten "Grafische Smileys deaktivieren", sonst gehen Codeteile beim Übertragen kaputt.
            Habe leider nicht gefunden wo ich das einstellen kann.

            Comment


            • #7
              antworten mit ERWEITERT -> Unter dem Eingabefeld -> "Zusätzliche Einstellungen"
              Christian

              Comment


              • #8
                Klein geschrieben: [position()] oder [$pos], falls Wert zuvor in der Variable $pos abgelegt.

                Comment


                • #9
                  HM...läuft noch immer nicht.
                  Mein Code:
                  <xsl:template match="ws:Cell">
                  <column visible="true">
                  <id><xsl:value-of select="position()"/></id>
                  <name><xsl:value-of select="../ws:Cell[position()]/wsata"/></name>
                  </column>
                  </xsl:template>

                  Beim Ablauf ist es nun so, dass für den ersten bzw. zweiten "Cell" node die richtige id ausgegeben wird ( "1" bzw. "2"). Aber für den "name" node bei id Inhalt "2" wird der Wert für id "1" ausgegeben:
                  Quelle:
                  <Row>
                  <Cell><Data ss:Type="String">Hugo</Data></Cell>
                  <Cell><Data ss:Type="Number">10</Data></Cell>
                  </Row>
                  Output
                  <column visible="true">
                  <id>1</id>
                  <name>Hugo</name>
                  </column>
                  <column visible="true">
                  <id>2</id>
                  <name>Hugo</name> -->Hier würde ich die "10" erwarten...
                  <column>
                  Zuletzt editiert von DerD; 11.02.2014, 08:51. Reason: smiley raus

                  Comment


                  • #10
                    ../ws:Cell greift auf das übergeordnete ws:Cell-Element zu (.. steht für die parent-Achse). Vielleicht ist ein alternativer Ansatz über die Attributtypen praktikabler (bezogen auf das Ausgangsbeispiel):
                    [Highlight=XML]<column visible="true">
                    <id><xsl:value-of select="position()"/></id>
                    <name><xsl:value-of select="ws:Cell[wsata[@ss:Type='String']]/wsata"/></name>
                    <type><xsl:value-of select="ws:Cell[wsata[@ss:Type='Number']]/wsata"/></type>
                    </column>[/Highlight]

                    Comment


                    • #11
                      Hallo,
                      Originally posted by DerD View Post
                      Hinweis: Bitte beim Posten "Grafische Smileys deaktivieren", sonst gehen Codeteile beim Übertragen kaputt.
                      Habe leider nicht gefunden wo ich das einstellen kann.
                      Oder noch besser die RICHTIGE FORMATIERUNG verwenden:
                      [highlight=xml]<xml>...</xml>[/highlight]
                      Sieht auch noch besser aus:
                      [highlight=xml]
                      <name><xsl:value-of select="ws:Cell[1]/wsata"/></name>
                      <name><xsl:value-of select="ws:Cell[Position()]/wsata"/></name>
                      [/highlight]

                      Gruß Falk
                      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                      Comment


                      • #12
                        [highlight=xml]<type><xsl:value-of select="ws:Cell[wsata[@ss:Type='Number']]/wsata"/></type>
                        [/highlight]
                        @Thomas Meinike:
                        das löst das Problem aber auch nicht. Ich möchte ja keinen Knoten "type". Im "name" Knoten soll entweder "Hugo (Bei id=1) oder "10" (bei id=2)
                        Zuletzt editiert von DerD; 11.02.2014, 13:09. Reason: Versucht richtig zu formatieren

                        Comment


                        • #13
                          Sofern ich das noch überblicke (name auf Zahlenwert setzen fühlt sich etwas seltsam an):
                          [Highlight=xml]<xsl:template match="ws:Row">
                          <xsl:apply-templates select="ws:Cell"/>
                          </xsl:template>

                          <xsl:template match="ws:Cell">
                          <column visible="true">
                          <id><xsl:value-of select="position()"/></id>
                          <name><xsl:value-of select="wsata"/></name>
                          </column>
                          </xsl:template>[/Highlight]

                          Comment

                          Working...
                          X