Announcement

Collapse
No announcement yet.

beim Auslesen werden Daten mehrfach erzeugt

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

  • beim Auslesen werden Daten mehrfach erzeugt

    Hallo zusammen,

    ich hab mal wieder ein Problem. Ich transformiere Daten einer XML um, um die Struktur leicht zu ändern und bestimmte Sachen hinzuzufügen.
    In der Original XML ist Superhead und HeadGroup auf einer Ebene.
    Ich brauche die HeadGroup allerdings eine Ebene in der Superhead verschachtelt.


    Hier mal die XML:

    Code:
    <Seite nr="15" typ="Zubehoer">
    <Zubehoer>
    <Superhead mref="38305" show="yes">Allgemeines Zubehör.</Superhead>
    <HeadGroup>
    <Head mref="9349">Werkzeugkoffer</Head>
    <SubheadGroup>
    <CopyGroup>
    <Copy mref="13991">Kunststoff 305 x 265 x 90 mm</Copy>
    <Abbildung File="z33901065007"/>
    <Wertetabelle Linie="1" Spaltenbreite="(0,1)">
    <Tabellenkopf>
    <Tab_Best/>
    </Tabellenkopf>
    <Werte>
    <Bestellnummer>3 39 01 065 00 7</Bestellnummer>
    </Werte>
    </Wertetabelle>
    </CopyGroup>
    <CopyGroup>
    <Copy mref="13992">Metall 390 x 240 x 110 mm</Copy>
    <Abbildung File="z33901067013"/>
    <Wertetabelle Linie="1" Spaltenbreite="(0,1)">
    <Tabellenkopf>
    <Tab_Best/>
    </Tabellenkopf>
    <Werte>
    <Bestellnummer>3 39 01 067 01 3</Bestellnummer>
    </Werte>
    </Wertetabelle>
    </CopyGroup>
    </SubheadGroup>
    </HeadGroup>
    <HeadGroup>
    <Head mref="9402">Balancer</Head>
    <SubheadGroup>
    <CopyGroup>
    <Copy mref="13506">Detaillierte Angaben zu FEIN Balancer finden Sie im Kapitel Zubehör / Balancer.</Copy>
    <Abbildung File=""/>
    </CopyGroup>
    </SubheadGroup>
    </HeadGroup>


    Hier mal der Auszug aus meinem Script:
    Code:
    <xsl:for-each select="Zubehoer">
    <xsl:element name="Zubehoer">
    <xsl:for-each select="Superhead">
    <xsl:element name="Superhead">
    <xsl:attribute name="id">
    <xsl:value-of select="(concat('s',count(preceding::Superhead)+1))"/>
    </xsl:attribute>
    <xsl:attribute name="mref">
    <xsl:value-of select="@mref"/>
    </xsl:attribute>
    <xsl:attribute name="show">
    <xsl:value-of select="@show"/>
    </xsl:attribute>
    <xsl:attribute name="wert">
    <xsl:value-of select="."/>
    </xsl:attribute>								
    <xsl:for-each select="../HeadGroup">
    <xsl:element name="HeadGroup">
    <xsl:for-each select="Head">
    <xsl:element name="Head">
    <xsl:attribute name="mref">
    <xsl:value-of select="@mref"/>
    </xsl:attribute>
    <xsl:value-of select="."/>
    </xsl:element>
    </xsl:for-each>
    <xsl:for-each select="SubheadGroup">
    <xsl:element name="SubheadGroup">
    <xsl:for-each select="CopyGroup">
    <xsl:element name="CopyGroup">
    <xsl:for-each select="Copy">
    <xsl:element name="Copy">
    <xsl:attribute name="mref">
    <xsl:value-of select="@mref"/>
    </xsl:attribute>
    <xsl:value-of select="."/>
    </xsl:element>
    </xsl:for-each>
    <xsl:for-each select="Abbildung">
    <xsl:element name="Abbildung">
    <xsl:attribute name="File">
    <xsl:value-of select="(concat(@File,'.jpg'))"/>
    </xsl:attribute>
    </xsl:element>
    </xsl:for-each>
    <xsl:for-each select="Wertetabelle">
    <xsl:element name="Wertetabelle">
    <xsl:attribute name="Linie">
    <xsl:value-of select="@Linie"/>
    </xsl:attribute>
    <xsl:attribute name="Spaltenbreite">
    <xsl:value-of select="@Spaltenbreite"/>
    </xsl:attribute>													
    <xsl:for-each select="Tabellenkopf">
    <xsl:element name="Tabellenkopf">
    <xsl:for-each select="Tab_Titel1">
    <xsl:element name="Tab_Titel1">
    <xsl:attribute name="mref">
    <xsl:value-of select="@mref"/>
    </xsl:attribute>
    <xsl:value-of select="."/>
    </xsl:element>
    </xsl:for-each>
    <xsl:for-each select="Tab_Titel2">
    <xsl:element name="Tab_Titel2">
    <xsl:attribute name="mref">
    <xsl:value-of select="@mref"/>
    </xsl:attribute>
    <xsl:value-of select="."/>
    </xsl:element>
    </xsl:for-each>															<xsl:for-each select="Tab_Best">										<xsl:element name="Tab_Best">
    </xsl:element>
    </xsl:for-each>
    </xsl:element>
    </xsl:for-each>
    Nun habe ich folgendes Problem:
    So lange in einem Seiten-Tag nur eine Superhead ist, funktioniert alles super.
    Wenn jetzt aber in einem Seiten-Tag mehrere Superheads sind, dann liest er mir zu jeder Superhead alle auf der Seite vorkommenden HeadGroups aus.
    Also er wählt nicht nur diejenigen aus die eigentlich zu der entsprechenden Superhead gehören. Leider bin ich gestern zu keiner Lösung gekommen. Ich denke das ich auch wieder viel zu kompliziert denke das mir einfach Fachwissen in diesem Bereich fehlt. Meine Idee war, die Headgroup anhand der erzeugten ID der Superhead zu sortieren. Leider bekomme ich das einfach nicht geregelt.
    Kann mir da jemand helfen.

    Vielen Dank schon einmal

  • #2
    Wenn es um das ausgehend von Superhead direkt folgende Geschwisterelement HeadGroup geht, dann greife so darauf zu:

    following-sibling::HeadGroup*[1]

    Comment


    • #3
      Hallo Thomas,

      vielen Dank für den Tipp. Leider verstehe ich nicht so recht wie das klappen soll.

      hier mal das Script nach deinem Tipp:

      Code:
      <xsl:for-each select="Zubehoer">
        <xsl:element name="Zubehoer">
          <xsl:for-each select="Superhead">
            <xsl:element name="Superhead">
              <xsl:attribute name="id">
                <xsl:value-of select="(concat('s',count(preceding::Superhead)+1))"/>
      	</xsl:attribute>
      	<xsl:attribute name="mref">
      	  <xsl:value-of select="@mref"/>
      	</xsl:attribute>
      	<xsl:attribute name="show">
      	   <xsl:value-of select="@show"/>
      	</xsl:attribute>
      	<xsl:attribute name="wert">
                <xsl:value-of select="."/>
      	</xsl:attribute>								
      <xsl:for-each select="../HeadGroup">
      							<xsl:element name="HeadGroup">
      								<xsl:for-each select="Head">
      									<xsl:element name="Head">
      										<xsl:attribute name="mref">
      											<xsl:value-of select="@mref"/>
      										</xsl:attribute>
      									<xsl:value-of select="following-sibling::HeadGroup*[1]"/>
      									</xsl:element>
      								</xsl:for-each>
      So bekomme ich eine Fehlermeldung auf Grund eines ungültigen X-Path Ausdrucks. Das liegt doch wahrscheinlich daran, das ich vorher wieder eine Ebene hoch muß um HeadGroup auszulesen, oder?

      Viele Grüße
      Zuletzt editiert von database; 20.08.2007, 12:03.

      Comment


      • #4
        Wenn ich das noch richtig verstehe, sollte mein Hinweis hier greifen:

        <xsl:for-each select="../HeadGroup">
        ...

        <xsl:for-each select="following-sibling::HeadGroup*[1]">
        ...

        Comment


        • #5
          Ja, sorry. Ich hatte das falsche reinkopiert.
          Ich bekomme die Fehlermeldung aber trotzdem.

          Hier jetzt der richtige Code:

          Code:
          <xsl:for-each select="Superhead">
          <xsl:element name="Superhead">
          <xsl:attribute name="id">
          <xsl:value-of select="(concat('s',count(preceding::Superhead)+1))"/>
          </xsl:attribute>
          <xsl:attribute name="mref">
          <xsl:value-of select="@mref"/>
          </xsl:attribute>
          <xsl:attribute name="show">
          <xsl:value-of select="@show"/>
          </xsl:attribute>
          <xsl:attribute name="wert">
          <xsl:value-of select="."/>
          </xsl:attribute>								
          <xsl:for-each select="following-sibling::HeadGroup*[1]">
          <xsl:element name="HeadGroup">
          Viele Grüße

          Comment


          • #6
            Mein Fehler -- nimm den Stern heraus.

            Comment


            • #7
              Ja, jetzt haut es hin. Doch leider hilft mir das nicht weiter.
              Wir lesen jetzt ja immer nur die erste HeadGroup einer Superhead aus.
              Es kann aber sein, das es mal 3 und mal 5 oder auch eine andere Anzahl HeadGroups zu einer Superhead sind. Deswegen hatte ich auch an folgendes gedacht.

              Ich wollte beim auslesen der Superhead durchzählen lassen, wieviele HeadGroups vorhanden sind und diesen Wert speichern und dann in den X-Path Ausdruck einbauen. Was hälts du von der vorgehensweise?
              Zuletzt editiert von database; 20.08.2007, 14:26.

              Comment


              • #8
                Probiere es doch einfach aus.

                Comment

                Working...
                X