AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XML / XSLT Reihenfolge definieren.
Thema durchsuchen
Ansicht
Themen-Optionen

XML / XSLT Reihenfolge definieren.

Ein Thema von StTüff · begonnen am 1. Dez 2006 · letzter Beitrag vom 4. Dez 2006
Antwort Antwort
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#1

XML / XSLT Reihenfolge definieren.

  Alt 1. Dez 2006, 13:39
Hallo!

Ich habe ein recht einfaches Problem, an dem ich aber beinahe verzweifle. Ich verfolge vermutlich den falschen Ansatz. Vielleicht kann mich jemand auf die richtige Bahn lenken.

Ich habe eine XML-Datei mit folgender Struktur:
XML-Code:
<ebeneA att1="1">
  <ebeneB2 att4="1">
    <ebeneD att5="1"/>
  </ebeneB2>
  <ebeneB1 att2="1">
    <ebeneC att3="1"/>
  </ebeneB1>
</ebeneA>
Ich möchte nun mittels XSL die Struktur so verändern, dass "ebeneB2" mit "ebeneB1" schlicht und einfach getauscht wird. Also in diese Form:
XML-Code:
<ebeneA att1="1">
  <ebeneB1 att2="1">
    <ebeneC att3="1"/>
  </ebeneB1>
  <ebeneB2 att4="1">
    <ebeneD att5="1"/>
  </ebeneB2>
</ebeneA>
Ich habe nun versucht das so zu lösen:
XML-Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/ | @* | node()">
   



    <xsl:apply-templates select="ebeneA | @* | node()"/>
    <xsl:apply-templates select="ebeneA/ebeneB1 | @* | node()"/>
    <xsl:apply-templates select="ebeneA/ebeneB2 | @* | node()"/>
   </p>
  </xsl:template>

  <xsl:template match="ebeneB1 | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="ebeneB2 | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="ebeneA | @* | node()">
    <xsl:copy>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
Dabei kommt dann aber natürlich folgendes raus:
XML-Code:
<?xml version="1.0"?>




  <ebeneA/>
  <ebeneA/>
  <ebeneB1 att2="1">
    <ebeneC/>
  </ebeneB1>
  <ebeneA/>
  <ebeneB2 att4="1">
    <ebeneD/>
  </ebeneB2>
</p>
Ich habe diverse Varianten versucht, konnte aber den "Durchbruch" noch nicht schaffen.

Vermutlich ist die Lösung recht einfach. Um so dankbarer bin ich, wenn mir einer auf die Sprünge helfen könnte. Ich bin auf diesem Gebiet noch absoluter Neuling.

Gruß und schon mal vielen Dank,

StTüff

[edit=Christian Seehase]Editiert, damit der Code wieder angezeigt wird. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: XML / XSLT Reihenfolge definieren.

  Alt 1. Dez 2006, 15:57
Hallo,

im konkreten Fall deines Beispieldokuments reicht das hier:

XML-Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:template match="/ | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()">
        <xsl:sort select="local-name()"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
Sollte dein echtes Dokument allerdings einen anderen Aufbau haben, dann musst du mal das Schema zeigen oder den Aufbau hinreichend genau beschreiben.

Grüße vom marabu

[edit=Christian Seehase]Editiert, damit der Code wieder angezeigt wird. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: XML / XSLT Reihenfolge definieren.

  Alt 2. Dez 2006, 11:11
Hallo marabu!

Erst mal vielen Dank für die Antwort!
Das sortieren funktioniert natürlich nur bei dem Beispiel, weil für die Knotennamen eine Bezeichnung gewählt wurde, die (zufällig) eine Sortierung zulässt. Ich gebe zu das mein Beispiel in sofern schlecht war.

Das eigentliche Zeil, das ich erreichen wollte ist, über die Transformation eine vorgegebene Reihenfolge zu erhalten.
Um das noch mal klarer zu machen, möchte ich das Beispiel um "ebeneB3" erweitern.

Ich möchte dann über die xsl-transformation z.B. folgende Reihenfolge festlegen können:
XML-Code:
<ebeneA att1="1">
  <ebeneB1 att2="1">
    <ebeneC att3="1"/>
  </ebeneB1>
  <ebeneB3 att4="1">
    <ebeneD att5="1"/>
  </ebeneB3>
  <ebeneB2 att4="1">
    <ebeneD att5="1"/>
  </ebeneB2>
</ebeneA>
Das geht dann mit Sortieren nicht mehr. Natürlich könnte man nun sagen: "Dann sorg doch dafür, dass es von vornherein richtig im XML-File steht". Das ist aber leider nicht möglich.

Da ich aber die Knotennamen kenne, bin ich auf die Idee gekommen, dies durch Filtern und gezieltes Zusammensetzen zu realisieren (das war die ursprüngliche Idee).
Vielleicht gibt es ja noch die Möglichkeit einer "Sortiervorlage" o.Ä. über die ich beim Wälzen der Dokumentation noch nicht gestolpert bin. Ich habe das gefühl, dass es ein ganz einfach Lösung geben wird, die ich (noch) nicht gefunden habe

Gruß,

StTüff

[edit=Christian Seehase]Editiert, damit der Code wieder angezeigt wird. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: XML / XSLT Reihenfolge definieren.

  Alt 2. Dez 2006, 18:39
Hallo,

mir war schon klar, dass dein Beispieldokument synthetisch ist. Was mein XSLT-Skript dir aber gezeigt haben sollte ist, dass du ein Sortierkriterium in deinem XML-Dokument brauchst. Wenn die gewünschte Ordnung nicht aus den Daten selbst abgeleitet werden kann, dann bleibt dir nichts anderes übrig, als die Knoten individuell zu ordnen.

Freundliche Grüße
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: XML / XSLT Reihenfolge definieren.

  Alt 4. Dez 2006, 09:37
Hallo!

OK. "Von den Daten ableiten" bedeutet aber, dass es in auf- oder absteigender Reihenfolge sein muss. Mir bringt es nichts, wenn ich die gewünschte Reihenfolge kenne, oder?

Wenn ich die Namen vor dem sortieren ersetzen würde, also z.B. ebeneB1 wird E1, ebeneB3 wird E2 und ebeneB2 wird E3, dann könnte ich sortieren und würde die gewünschte Reihenfolge erhalten. Anschließend könnte ich die Knotennamen wieder durch die richtigen ersetzen. Würde das gehen?

Gruß,

StTüff
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: XML / XSLT Reihenfolge definieren.

  Alt 4. Dez 2006, 10:32
OK. Ich glaube ich hab's jetzt selbst gelöst.

Basierend auf meinem ursprünglichen Ansatz mache ich nun folgendes:
XML-Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="ebeneA | @* ">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="ebeneB1" />
      <xsl:apply-templates select="ebeneB3" />
      <xsl:apply-templates select="ebeneB2" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="ebeneB2 | ebeneB2/* | @* ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="ebeneB1 | ebeneB1/* | @* ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="ebeneB3 | ebeneB3/* | @* ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
Damit erhalte ich aus:
XML-Code:
<ebeneA att1="1">
  <ebeneB2 att4="1">
    <ebeneD att5="1">Hallo</ebeneD>
  </ebeneB2>
  <ebeneB3 att2="1">
    <ebeneC att3="1"/>
  </ebeneB3>
  <ebeneB1 att2="1">
    <ebeneC att3="1"/>
  </ebeneB1>
</ebeneA>
dieses Ergebnis (das damit in der gewünschten Reihenfolge ist und in dem trotzdem alle Knoten enthalten sind):
XML-Code:
<ebeneA att1="1">
  <ebeneB1 att2="1">
    <ebeneC att3="1"/>
  </ebeneB1>
  <ebeneB3 att2="1">
    <ebeneC att3="1"/>
  </ebeneB3>
  <ebeneB2 att4="1">
    <ebeneD att5="1">Hallo</ebeneD>
  </ebeneB2>
</ebeneA>
Gibt es Kritik oder Hinweise zu diesem Ergebnis? Wie gesagt: Ich bin hier "Neuling" und noch sehr unsicher.

Gruß und vielen Dank für die Beiträge,

StTüff

[edit=Christian Seehase]Editiert, damit der Code wieder angezeigt wird. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz