Tobias Denner: XML mit XSL umwandeln

Hier mein Problem:
ICh habe von einem Programm (nennen wir es Lexware) eine XML Datei bekommen.
Jetzt habe ich das Problem, dass ich diese in eine CSV umwandeln muss.

Ich wandle also die Zeile
<DESCRIPTION_SHORT>Bmein kleiner Text</DESCRIPTION_SHORT>

mit <xsl:value-of select="DESCRIPTION_SHORT"/>  um. Soweit klar.

Aber wie lese ich aus

  • <ARTICLE_FEATURES>
  • <FEATURE>
      <FNAME>Gewicht</FNAME>
      <FVALUE>1.000000</FVALUE>
      </FEATURE>
  • <FEATURE>
      <FNAME>artikelnr</FNAME>
      <FVALUE>test csv</FVALUE>
      </FEATURE>
  • <FEATURE>
      <FNAME>beschreibung</FNAME>
      </FEATURE>
      </ARTICLE_FEATURES>

je den fvalue für "1.000", den für "test csv" und den für "beschreibung"  aus?
mit <xsl:value-of select="ARTICLE_FEATURES/FEATURE/FVALUE"/> steht ja nicht fest welches von den dreien gemeint ist.

und die XML kann ich leider nicht ändern....

  1. Hallo,

    Jetzt habe ich das Problem, dass ich diese in eine CSV umwandeln muss.

    Aber wie lese ich aus
    je den fvalue für "1.000", den für "test csv" und den für "beschreibung"  aus?
    mit <xsl:value-of select="ARTICLE_FEATURES/FEATURE/FVALUE"/> steht ja nicht fest welches von den dreien gemeint ist.

    <xsl:value-of select="ARTICLE_FEATURES/FEATURE[FNAME = 'Gewicht']/FVALUE"/> = 1.0...

    <xsl:value-of select="ARTICLE_FEATURES/FEATURE[FNAME = 'artikelnr']/FVALUE"/>

    Usw.

    Grüße
    Thomas

    1. OK.. Ich komme trotzdem nicht weiter. Hier meine XML:

      -----------------------------------------------------------

      <?xml version="1.0" encoding="iso-8859-1" ?>

      • <BMECAT version="1.2" xmlns="http://www.bmecat.org/bmecat/1.2/bmecat_new_catalog">
      • <HEADER>
          <GENERATOR_INFO>Created by LxBMECAT 1.0</GENERATOR_INFO>
      • <CATALOG>
          <LANGUAGE>DEU</LANGUAGE>
          <CATALOG_ID />
          <CATALOG_VERSION>1.0</CATALOG_VERSION>
          <CURRENCY>EUR</CURRENCY>
      • <DATETIME type="generation_date">
          <TIME>20:24:46</TIME>
          <DATE>2006-09-15</DATE>
          </DATETIME>
          </CATALOG>
      • <SUPPLIER>
          <SUPPLIER_NAME>Lexware faktura+auftrag</SUPPLIER_NAME>
          </SUPPLIER>
          </HEADER>
      • <T_NEW_CATALOG>
      • <CATALOG_GROUP_SYSTEM>
      • <CATALOG_STRUCTURE type="root">
          <GROUP_ID>1</GROUP_ID>
          <GROUP_NAME>Produktgruppen</GROUP_NAME>
          <PARENT_ID>0</PARENT_ID>
          <GROUP_DESCRIPTION />
          </CATALOG_STRUCTURE>
      • <CATALOG_STRUCTURE type="leaf">
          <GROUP_ID>6</GROUP_ID>
          <GROUP_NAME>Brother Tinte</GROUP_NAME>
          <PARENT_ID>1</PARENT_ID>
          </CATALOG_STRUCTURE>
          </CATALOG_GROUP_SYSTEM>
      • <ARTICLE>
          <SUPPLIER_AID>18</SUPPLIER_AID>
          <MIME_INFO />
      • <ARTICLE_ORDER_DETAILS>
          <ORDER_UNIT>C62</ORDER_UNIT>
          </ARTICLE_ORDER_DETAILS>
      • <ARTICLE_DETAILS>
          <DESCRIPTION_SHORT>Brother: Kompatible Patrone LC-900 BK</DESCRIPTION_SHORT>
          <DESCRIPTION_LONG>TEXT</DESCRIPTION_LONG>
          </ARTICLE_DETAILS>
      • <ARTICLE_FEATURES>
      • <FEATURE>
          <FNAME>Gewicht</FNAME>
          <FVALUE>1.000000</FVALUE>
          </FEATURE>
      • <FEATURE>
          <FNAME>artikelnr</FNAME>
          <FVALUE>test csv</FVALUE>
          </FEATURE>
      • <FEATURE>
          <FNAME>beschreibung</FNAME>
          </FEATURE>
          </ARTICLE_FEATURES>
      • <ARTICLE_PRICE_DETAILS>
      • <ARTICLE_PRICE type="net_list">
          <PRICE_AMOUNT>2.69</PRICE_AMOUNT>
          <TAX>0.1600</TAX>
          </ARTICLE_PRICE>
          </ARTICLE_PRICE_DETAILS>
      • <USER_DEFINED_EXTENSIONS>
          <UDX.ARBITRARY_DATA>3;2.69</UDX.ARBITRARY_DATA>
          </USER_DEFINED_EXTENSIONS>
          </ARTICLE>
      • <ARTICLE_TO_CATALOGGROUP_MAP>
          <ART_ID>18</ART_ID>
          <CATALOG_GROUP_ID>6</CATALOG_GROUP_ID>
          </ARTICLE_TO_CATALOGGROUP_MAP>
          </T_NEW_CATALOG>
          </BMECAT>

      ------------------------------------------------------------------

      Hier meine XLS mit zwei Beispielen:

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text"/>
      <xsl:template match="/">
      <xsl:apply-templates select="T_NEW_CATALOG"/>
      </xsl:template>
      <xsl:template match="T_NEW_CATALOG">
      <xsl:value-of select="ARTICLE/ARTICLE_FEATURES/FEATURE[FNAME = 'artikelnr']/FVALUE"/>;
      <xsl:value-of select="ARTICLE/ARTICLE_DETAILS/DESCRIPTION_LONG"/>;
      xsl:text
      </xsl:text>
      </xsl:template>
      </xsl:stylesheet>

      -------------------------------------------------------------------

      Das Resultat ist eine leere CSV. Der Fehler müsste im template select und template match liegen. Aber ich finde Ihn nicht.

      1. Hallo,

        OK.. Ich komme trotzdem nicht weiter. Hier meine XML:

        Hier meine XLS mit zwei Beispielen:

        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text"/>
        <xsl:template match="/">
        <xsl:apply-templates select="T_NEW_CATALOG"/>

        ^^^^^^^^^^^^^^^^

        Das Resultat ist eine leere CSV. Der Fehler müsste im template select und template match liegen. Aber ich finde Ihn nicht.

        Es gibt in deinem XML aber keinen Element "T_NEW_CATALOG"! Da kann auch nichts selektiert werden.

        Grüße
        Thomas

        1. Wie müsste dann das Script lauten um z.B.
            <FNAME>artikelnr</FNAME>
            <FVALUE>test csv</FVALUE>
          auszulesen? (also des wert test csv)

          Ich finde im Internet keine andere Möglichkeit die XML zum CSV kompatibel zu machen. Müsste also aus der XML die nötigen Werte auslesen.

          Für eine kurze Hilfe wäre ich wirklich dankbar!

          1. Hallo,

            Wie müsste dann das Script lauten um z.B.
              <FNAME>artikelnr</FNAME>
              <FVALUE>test csv</FVALUE>
            auszulesen? (also des wert test csv)

            Ich finde im Internet keine andere Möglichkeit die XML zum CSV kompatibel zu machen. Müsste also aus der XML die nötigen Werte auslesen.

            Zwei Dinge muss du berücksichtigen:

            1. dass du immer den richtigen Pfad brauchst
            2. in diesem Fall, dass du im XML einen default-Namesraum hast, damit kann XSL 1.0 nicht so gut umgehen, daher muss du also dafür sorgen, dass er disen Namensraum auch kennt.

            -----------
            <?xml version="1.0" encoding="UTF-8"?>
            <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:bm="http://www.bmecat.org/bmecat/1.2/bmecat_new_catalog" exclude-result-prefixes="bm">
             <xsl:output method="text" />
             <xsl:template match="/">
              <xsl:apply-templates select="bm:BMECAT/bm:T_NEW_CATALOG" />
             </xsl:template>
             <xsl:template match="bm:T_NEW_CATALOG">
              <xsl:value-of select="bm:ARTICLE/bm:ARTICLE_FEATURES/bm:FEATURE[bm:FNAME = 'artikelnr']/bm:FVALUE" />;
              <xsl:value-of select="bm:ARTICLE/bm:ARTICLE_DETAILS/bm:DESCRIPTION_LONG" />;
              xsl:text
              </xsl:text>
             </xsl:template>
            </xsl:stylesheet>
            ---------

            Du kannst statt dem Prefix "bm" irgendwas nehmen, "x" "foo", "bar", "blabla", es ist egal, nur musst du deine Elemente dann im XSL _immer_ mit diesem Prefix schreiben. Wenn du mal keine Ausgabe wie erwartet bekommst, überprüfe zuerst ob du nicht irgendwo ein Prefix vergessen hast.

            Grüße
            Thomas

            1. Danke.. Jetzt gehts. Jetzt muss ich mich nur noch drum kümmern, warum die Namen mit einem Viereck nach dem Import der CSV erscheinen...

              Also immer ein Buchstabe, dann ein Viereck

              Sonst vielen Dank!!

              1. Hallo,

                Danke.. Jetzt gehts. Jetzt muss ich mich nur noch drum kümmern, warum die Namen mit einem Viereck nach dem Import der CSV erscheinen...

                Also immer ein Buchstabe, dann ein Viereck

                Da wird offensichtlich ein Zeichen verwendet für das in der Schriftart, die du für die Anzeige nimmst, keine entsprechende Glyphe (also Bildzeichen) vorhanden ist.

                Grüße
                Thomas

              2. Hi,

                Also immer ein Buchstabe, dann ein Viereck

                Ist das Output-Encoding zufällig UTF-16 und die Vierecke sind die 0-Bytes, die Deine Software darstellt, weil sie das UTF-16 nicht erkennt?

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                Schreinerei Waechter
                O o ostern ...
                Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.