tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von hela
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
1677
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Bexx
    Bexx Bexx ist offline Programmer
    Registriert seit
    Feb 2009
    Ort
    Saarbrooklyn
    Beiträge
    222
    Servus Foris,

    ist es möglich in eine XML einen Knoten einzufügen, ohne im XSLT die übrige Dokumentstruktur manuell nachzubauen?
     
    Christopher Columbus didn't need directions, neither do we!

    Alles hat eine Logik. Selbst wenn es keine Logik gibt.

    ***

    NetBeans 7.x, GlassFish v3
    JSF 2.0
    Java EE

  2. #2
    Avatar von hela
    hela hela ist offline Mitglied Smaragd
    tutorials.de Premium-User
    Registriert seit
    Oct 2004
    Beiträge
    1.123
    Hallo,

    das kannst du mit dem Identity Template (o.a. Identity Copy) machen. Damit kopiert man das unveränderte Quelldokument in den Ausgabebaum:
    Code xml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    <?xml version="1.0" encoding="UTF-8"?>
    <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:copy>
    </xsl:template>
     
    </xsl:stylesheet>
    Wenn du jetzt ins Dokument etwas einfügen willst, dann musst du die Stelle irgendwie markieren. Beispielsweise mit einem Attribut.
    Angenommen dein Quelldokument ist file1.xml und du willst file2.xml vor oder nach einem markierten Knoten einfügen:
    Code xml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="xml" indent="yes" encoding="UTF-8" />
     
    <xsl:variable name="insertion" select="document('file2.xml')/node()" />
     
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
     
    <!-- Fügt vor allen Knoten, die das Attribut [insert="before"] haben,
         den Knoten "$insertion" ein: -->
    <xsl:template match="*[@insert='before']">
        <xsl:copy-of select="$insertion" />
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
     
    <!-- Fügt nach allen Knoten, die das Attribut [insert="after"] haben,
         den Knoten "$insertion" ein: -->
    <xsl:template match="*[@insert='after']">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
        <xsl:copy-of select="$insertion" />
    </xsl:template>
     
    </xsl:stylesheet>
    Ebenso lassen sich auch Knoten ersetzen:
    Code xml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="xml" indent="yes" encoding="UTF-8" />
     
    <xsl:variable name="replacement" select="document('file2.xml')/node()" />
     
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
      </xsl:copy>
    </xsl:template>
     
    <!-- Ersetzt alle Knoten namens "replace" durch den Ersatzknoten "$replacement": -->
    <xsl:template match="replace">
        <xsl:copy-of select="$replacement" />
    </xsl:template>
     
    </xsl:stylesheet>
    Geändert von hela (26.09.11 um 19:24 Uhr)
    Bexx bedankt sich. 

  3. #3
    Avatar von Bexx
    Bexx Bexx ist offline Programmer
    Registriert seit
    Feb 2009
    Ort
    Saarbrooklyn
    Beiträge
    222
    Das scheint ja genau dein Fachgebiet zu sein, tip top, das löst den Rest meiner Probleme!
    Dein Buch hab ich mir gestern im Übrigen angesehn, bis auf dass es zu teuer fürs Azubibudget ist, liest sichs aber gut und scheint gut geschrieben
     
    Christopher Columbus didn't need directions, neither do we!

    Alles hat eine Logik. Selbst wenn es keine Logik gibt.

    ***

    NetBeans 7.x, GlassFish v3
    JSF 2.0
    Java EE

  4. #4
    Avatar von Bexx
    Bexx Bexx ist offline Programmer
    Registriert seit
    Feb 2009
    Ort
    Saarbrooklyn
    Beiträge
    222
    HALT! noch eine Frage. Das mit den Attributen, finde ich einen guten Ansatz. Aber ich verstehe nicht anhand welcher Logik er dann weiß, das Attribut VOR einem Knoten einzufügen... Danach einfügen ist klar, wie das funktioniert.
    Aber wenn ich zum Beispiel sagen würde füge mir etwas vor einem <Customer> Knoten ein, müsste ich dann nicht den Knoten davor mit dem Attribut flaggen? weil ich meine, die Attribute kann er ja nur interpretieren wenn ich ihm sage, was er damit tun soll...
     
    Christopher Columbus didn't need directions, neither do we!

    Alles hat eine Logik. Selbst wenn es keine Logik gibt.

    ***

    NetBeans 7.x, GlassFish v3
    JSF 2.0
    Java EE

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.
    Zitat Zitat von Bexx Beitrag anzeigen
    HALT! noch eine Frage. Das mit den Attributen, finde ich einen guten Ansatz. Aber ich verstehe nicht anhand welcher Logik er dann weiß, das Attribut VOR einem Knoten einzufügen... Danach einfügen ist klar, wie das funktioniert.
    Da braucht es doch keine extra Logik. Beim Davor-Einfügen rufst du erst copy-of auf und danach apply-templates, beim Danach-Einfügen ist es umgekehrt.
    Zitat Zitat von Bexx Beitrag anzeigen
    Aber wenn ich zum Beispiel sagen würde füge mir etwas vor einem <Customer> Knoten ein, müsste ich dann nicht den Knoten davor mit dem Attribut flaggen?
    Nein. Wenn du das "before" Tag verwendest nicht.
    Zitat Zitat von Bexx Beitrag anzeigen
    weil ich meine, die Attribute kann er ja nur interpretieren wenn ich ihm sage, was er damit tun soll...
    Wie bestimmte Knoten verarbeitet werden legst du im Template fest. Irgendwie verstehe ich da deine Argumentation nicht.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Avatar von Bexx
    Bexx Bexx ist offline Programmer
    Registriert seit
    Feb 2009
    Ort
    Saarbrooklyn
    Beiträge
    222
    Zitat Zitat von deepthroat Beitrag anzeigen
    Hi.
    Da braucht es doch keine extra Logik. Beim Davor-Einfügen rufst du erst copy-of auf und danach apply-templates, beim Danach-Einfügen ist es umgekehrt.
    Hab verstanden. Das mit dem umgekehrten Aufruf ist mir nicht aufgefallen- ich hab nur gesehen, dass er die Attribute verändert hat. Alles weitere wird damit klar, danke.
     
    Christopher Columbus didn't need directions, neither do we!

    Alles hat eine Logik. Selbst wenn es keine Logik gibt.

    ***

    NetBeans 7.x, GlassFish v3
    JSF 2.0
    Java EE

  7. #7
    Avatar von Bexx
    Bexx Bexx ist offline Programmer
    Registriert seit
    Feb 2009
    Ort
    Saarbrooklyn
    Beiträge
    222
    Bestimmt nerv ich euch schon ...
    ich möchte das ganze Knoteneinfügen an eine Bedingung geknüpft ausführen.
    Die Bedingung ist, dass der Wert mit aus mehreren verteilten, gleichnamigen Knoten aus file1.xml mit den Werten mehrerer verteilter gleichnamigen Knoten aus der file2.xml übereinstimmen muss und NUR DANN darf ich das entsprechende Knotenset an die DestinationLocation verschieben.

    Da ich zumindest nicht wüsste wie ich das mit verschachtelten FOR-schleifen lösen kann, da ich mit der Angabe select="." keinen Unique Identifier mehr habe ist meine erste Idee nun, mir aus file1.xml den Count der betroffen Knoten ausgeben lassen, aus denen ich den Value auslesen will und mich dann im Anschluss mit position() durch die Knoten hangeln. Klingt für mich nach Spaghetti-Code, da gibts sicher was besseres oder?!
     
    Christopher Columbus didn't need directions, neither do we!

    Alles hat eine Logik. Selbst wenn es keine Logik gibt.

    ***

    NetBeans 7.x, GlassFish v3
    JSF 2.0
    Java EE

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von Bexx Beitrag anzeigen
    Bestimmt nerv ich euch schon ...
    Naja, wir müssen ja nicht antworten...
    Zitat Zitat von Bexx Beitrag anzeigen
    ich möchte das ganze Knoteneinfügen an eine Bedingung geknüpft ausführen.
    Die Bedingung ist, dass der Wert mit aus mehreren verteilten, gleichnamigen Knoten aus file1.xml mit den Werten mehrerer verteilter gleichnamigen Knoten aus der file2.xml übereinstimmen muss und NUR DANN darf ich das entsprechende Knotenset an die DestinationLocation verschieben.
    Du mußt schon mal genauer spezifizieren wann die Knotensets gleich sind. Muss die Reihenfolge eingehalten werden? Sprich: sind
    Code xml:
    1
    2
    3
    4
    
    <r>
      <a>1</a>
      <a>2</a>
    </r>
    Code xml:
    1
    2
    3
    4
    
    <r>
      <a>2</a>
      <a>1</a>
    </r>
    diese 2 Dokumente bzgl. Der Knotensets //a gleich?

    Zitat Zitat von Bexx Beitrag anzeigen
    Da ich zumindest nicht wüsste wie ich das mit verschachtelten FOR-schleifen lösen kann, da ich mit der Angabe select="." keinen Unique Identifier mehr habe ist meine erste Idee nun, mir aus file1.xml den Count der betroffen Knoten ausgeben lassen, aus denen ich den Value auslesen will und mich dann im Anschluss mit position() durch die Knoten hangeln. Klingt für mich nach Spaghetti-Code, da gibts sicher was besseres oder?!
    Du könntest tatsächlich erstmal alle Knoten die für die Bedingung notwendig sind zählen. Dann zählst du die Knoten auf die die Bedingung zutrifft (kommt auf die Bedingung an wie du das Bewerkstelligen kannst). Sind diese Zähler gleich, trifft die Bedingung auf alle Knoten zu.

    Gruß
    Bexx bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Avatar von Bexx
    Bexx Bexx ist offline Programmer
    Registriert seit
    Feb 2009
    Ort
    Saarbrooklyn
    Beiträge
    222
    Vielen Dank für die nochmal sehr ausführliche Antwort. Ich gebe mir Mühe mein Problem nächstes Mal genauer darzustellen und bessere Beispiele zu nennen.
    Ich konnte mein Problem doch mit einem XPfad-Ausdruck lösen, der ungefähr so aussieht:
    Code xml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
        <xsl:template match="myLocation/mySubLocation/mySubSubLocation">
     
          <!-- THIS CONTAINS SOURCE OF INTENDED INSERTION -->
            <xsl:element name="mySubSubLocation">
                    <xsl:copy-of select="document($sourceFile)/EBENE1/EBENE2/EBENE3/EBENE4/EBENE5[./ROLLE = current()/../../../EBENE4/EBENE5/EBENE6/EBENE7/EBENE8/text()]"/>          
            </xsl:element>
          <!-- END -->
            
        </xsl:template>
     
    Christopher Columbus didn't need directions, neither do we!

    Alles hat eine Logik. Selbst wenn es keine Logik gibt.

    ***

    NetBeans 7.x, GlassFish v3
    JSF 2.0
    Java EE

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 20.09.11, 14:22
  2. Antworten: 3
    Letzter Beitrag: 02.03.10, 11:00
  3. XML Knoten einfügen
    Von Meccs im Forum .NET Datenverwaltung
    Antworten: 0
    Letzter Beitrag: 12.11.08, 17:44
  4. Einen JButton in eine JComboBox einfügen
    Von Ryu20 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 12
    Letzter Beitrag: 27.02.08, 20:55
  5. Über Inhalte von Knoten iterieren XSLT
    Von chaertl im Forum XML Technologien
    Antworten: 2
    Letzter Beitrag: 03.02.06, 10:46