Announcement

Collapse
No announcement yet.

Elemente in Liste von Elementen unterscheiden

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

  • Elemente in Liste von Elementen unterscheiden

    Hallo zusammen,

    der Titel ist vermutlich nicht sehr aussagekräftig daher versuche ich das mal hier ein bisschen näher zu erläutern.

    Mir liegt ein XML-Datensatz vor den ich mittels XSLT umwandeln möchte. Dazu müsste ich auf die einzelnen Elemente einer Menge von Elementen zugreifen. Allerdings fehlt mir dazu ein Unterscheidungsmerkmal also z.B. ein Attribut mit einer laufenden Zahl.

    Der Datensatz sieht so aus:

    Code:
    <DataSet>
      <DataRow>
        <Name>Peter</Name>
      </DataRow>
      <DataRow>
        <Name>Jutta</Name>
      </DataRow>
    </DataSet>
    Ich könnte nun ohne Probleme alle Namen auslesen könnte aber nicht zwischen Jutta und Peter unterscheiden und hätte am Ende beide selektiert.
    Wenn jede "DataRow" beispielsweise mit einem Attribut id versehen wäre (<DataRow id=1>.. <DataRow id=2>) wüsste ich eine Lösung aber auf das Format habe ich keinen Einfluss.

    Am Ende möchte ich im Zielformat beispielsweise den Namen aus der ersten "DataRow" in ein Feld schreiben und den Namen aus der Zweiten in ein anderes.

    Ich habe leider nicht die großartigen Erfahrungen mit XSLT und denke inzwischen das es überhaupt nicht möglich ist. Oder gibt es doch eine Lösung?


    Ich kann morgen mal meine bisherigen Ansätze posten wenn es jemanden interessiert.


    Gute Nacht und vielen Dank fürs lesen.

  • #2
    Zum einem gibt es die "position()"-Funktion, also mit
    [highlight=xml]
    <xsl:template match="/">
    <xsl:apply-templates select="DataSet/DataRow/Name"/>
    </xsl:template>

    <xsl:template match="Name">
    <xsl:element name="NewName{position()}">
    <xsl:value-of select="."/>
    </xsl:element>
    </xsl:template>
    [/highlight]
    erhält man etwa
    [highlight=xml]
    <NewName1>Peter</NewName1>
    <NewName2>Jutta</NewName2>
    [/highlight]
    zum anderen kann per count() selbst zählen, weiterhin gibt es xsl: number, um zählen zu lassen. Also einen Index zu haben, ist sicher möglich (auch wenn ich eine Format wie NewName[n] nicht für sauber halte).

    Aber meist transformiert einfach per apply-templates und Template match, dabei lässt sich ja ohne weiteres jeder Knoten getrennt transformieren, also stellt sich in Normalfall das Problem aus meiner Sicht nicht.

    Deshalb schlage ich vor, dass du zu der Beispieleingabe mal das entsprechende Resultat postest, das mit XSLT erzeugt werden soll, dann kann man einen geeigneten Weg mit XSLT aufzeigen.

    Comment


    • #3
      Hallo und erstmal vielen Dank für die Antwort.

      Hört sich für mich schon mal gut an das es eigentlich kein Problem darstellt. Ich muss sagen das ich mich mit XSLT nicht sonderlich gut auskenne und bisher einfach keine Lösung gesehen habe.

      Als Ausgabe hätte ich gerne sowas hier:

      Code:
      <X>
         <Y>
            <Name>Peter</Name>
         </Y>
      </X>
      <X>
         <Y>
            <Name>Jutta</Name>
         </Y>
      </x>

      Gruß
      grill_

      Comment


      • #4
        In dem Fall der gewünschten Ausgabe wird ein Element ja gar nicht auf Grund seiner Position anders verarbeitet als das vorherige, man schreibt einfach Templates für jeden Elementyp
        [highlight=xml]
        <xsl:template match="DataSet">
        <X>
        <xsl:apply-templates/>
        </X>
        </xsl:template>

        <xsl:template match="DataRow">
        <Y>
        <xsl:apply-templates/>
        </Y>
        </xsl:template>

        <xsl:template match="Name">
        <xsl:copy-of select="."/>
        </xsl:tempate>
        [/highlight]

        Comment

        Working...
        X