Announcement

Collapse
No announcement yet.

Wert aus anderer Datei holen

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

  • Wert aus anderer Datei holen

    Hallo Zusammen
    Bin gerade dabei mich in XSLT einzuarbeiten, da ich Daten aus XML Dateien in eine DB importieren muss. Dabei habe ich folgendes Problem:

    Ich habe eine Import Datei die folgendermassen aussieht:

    <?xml version = '1.0' encoding = 'iso-8859-1'?>
    <objlist>
    <obj key="">
    <attr id="FK1">A1</attr>
    <attr id="FK2">A2</attr>
    <attr id="Bezeichnung"></attr>
    </obj>
    <obj key="">
    <attr id="FK1">A3</attr>
    <attr id="FK2">A2</attr>
    <attr id="Bezeichnung"></attr>
    </obj>
    <obj key="">
    <attr id="FK1">A1</attr>
    <attr id="FK2">A4</attr>
    <attr id="Bezeichnung"></attr>
    </obj>
    </objlist>

    und eine Datei die aus einer DB kommt, die sieht folgendermassen aus:

    <?xml version = '1.0' encoding = 'iso-8859-1'?>
    <result>
    <objlist>
    <obj key="1111">
    <attr id="FK1">A1</attr>
    <attr id="FK2">A2</attr>
    <attr id="Bezeichnung1">AAA</attr>
    <attr id="Bezeichnung2">BBB</attr>
    <!-- Hier stehen noch weitere ATTR Elemente -->
    </obj>
    <obj key="2222">
    <attr id="FK1">A3</attr>
    <attr id="FK2">A2</attr>
    <attr id="Bezeichnung1">CCC</attr>
    <attr id="Bezeichnung2">BBB</attr>
    <!-- Hier stehen noch weitere ATTR Elemente -->
    </obj>
    <obj key="3333">
    <attr id="FK1">A1</attr>
    <attr id="FK2">A4</attr>
    <attr id="Bezeichnung1">EEE</attr>
    <attr id="Bezeichnung2">AAA</attr>
    <!-- Hier stehen noch weitere ATTR Elemente -->
    </obj>
    </objlist>
    <result>

    Für den Import in die DB muss ich eine Datei erzeugen die gleich aussieht, wie die Erste, aber zusätzlich wie in der zweiten im obj Element den Wert des Key Attributes enthält.

    Ich Denke es müsste mittels document() und key() möglich sein dies zu realisieren. Ich habe aber nicht herausgefunden wie. Oder gibt es sogar eine bessere Lösung?

    Für ein Tipp wäre ich euch dankbar.
    Liebe Grüsse
    Dani

  • #2
    Wenn das Ausgabeformat bekannt ist, dann brauchen doch nur die gewünschten Inhalte transformiert werden:

    Code:
    <xsl:template match="result">
      <objlist>
        <xsl:apply-templates select="objlist"/>
      </objlist>
    </xsl:template>
    
    <xsl:template match="obj">
      <obj key="{@key}">
        <xsl:copy-of select="attr[@id='FK1']"/>
        <xsl:copy-of select="attr[@id='FK2']"/>
        <attr id="Bezeichnung"></attr>
      </obj>
    </xsl:template>

    Comment


    • #3
      Hallo Thomas
      Vielen Dank für deine Antwort.
      Wenn ich das richtig sehe beziehst du dein Stylesheet auf die zweite Datei. (zweiter Codebblock)
      Ich bräuchte aber etwas um die erste Datei umzuwandeln. Das Ausgangsdokument sieht wie die erste Datei aus, enthält aber zusätzlich den key aus der zweiten Datei. Verknüpft sollten sie mit den zwei Werten aus FK1 und FK2 werden.

      Vielleicht noch zum allgemeinen Verständniss: <Obj key= xxx> xxx ist der Primäre Schlüssel in der DB, <atr id=FK1>yyy</attr> yyy ist ein Fremdschlüssel (Das gleiche gilt für FK2)
      Anhand der Werte von FK1 und FK2 muss ich nun den Primärschlüssel ermittel.

      Zusätzlich ist noch zu sagen das in der zweiten Datei einige hunder Datensätze vorkommen, ich brauch aber nur die, die auch in der ersten vorhanden sind.

      Liebe Grüsse
      Dani

      Comment


      • #4
        Ok, dann habe ich das nicht richtig verstanden.

        Probiere es so (das erste Dokument sei dok1.xml und das zweite dok2.xml):
        Code:
        <xsl:variable name="dok2" select="document('dok2.xml')"/>
        
        <xsl:template match="@* | node()">
          <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>
        </xsl:template>
        
        <xsl:template match="@key">
          <xsl:attribute name="key">
            <xsl:variable name="FK1" select="parent::obj/attr[@id='FK1']"/>
            <xsl:variable name="FK2" select="parent::obj/attr[@id='FK2']"/>
            <xsl:value-of select="$dok2//obj[attr[@id='FK1']=$FK1 and attr[@id='FK2']=$FK2]/@key"/>
          </xsl:attribute>
        </xsl:template>
        Dabei wird angenommen, dass zu jedem obj-Element im ersten Dokument auch eine passendes key-Attribut im zweiten existiert (ansonsten erscheint wieder key="").

        Ergebnis der Transformation von dok1.xml:

        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <objlist>
          <obj key="1111">
            <attr id="FK1">A1</attr>
            <attr id="FK2">A2</attr>
            <attr id="Bezeichnung"></attr>
          </obj>
          <obj key="2222">
            <attr id="FK1">A3</attr>
            <attr id="FK2">A2</attr>
            <attr id="Bezeichnung"></attr>
          </obj>
          <obj key="3333">
            <attr id="FK1">A1</attr>
            <attr id="FK2">A4</attr>
            <attr id="Bezeichnung"></attr>
          </obj>
        </objlist>

        Comment


        • #5
          Hallo Thomas
          Vielen dank für deinen Code, er funktioniert wie gewünscht.
          Ist ja viel einfacher als gedacht, ich denke ich habe zu weit gesucht.

          Dass der Key leer ist ein willkommener nebeneffekt, da Datensätze mit leeren keys eh neu angelegt werden müssen und bei einem leeren Key dies automatisch geschiet.

          Ich hoffe, sobald ich mich ein wenig besser auskenne, hier auch mal jemandem zu helfen.

          Liebe Grüsse
          Dani

          Comment

          Working...
          X