tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Martin Honnen
  • 1 Beitrag von Martin Honnen
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
908
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    banshe banshe ist offline Mitglied Silber
    Registriert seit
    Mar 2010
    Beiträge
    58
    Hallo zusammen

    Ich habe neuerdings kurzzeitig mit XSL zu tun und bräuchte mal eure hilfe..

    Ich habe ein XML das etwa wie folgt aufgebaut ist:

    Code :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
     
      <belege>
     
        <!-- Abteilung A-->
     
        <beleg>
          <belegID>999</belegID>
          <abteilung>A</abteilung>
          <debitor>
            <personID>999</personID>
            <korrSprache>d</korrSprache>
            <geschlecht>m</geschlecht>
            <name>Peter</name>
            <vorname>Muster</vorname>
          </debitor>
          <positionen>
            ...
            ...
            ...
          </positionen>
        </beleg>
     
     
     
     
        <!-- Abteilung B-->
     
        <beleg>
          <belegID>888</belegID>
          <abteilung>B</abteilung>
          <debitor>
            <personID>999</personID>
            <korrSprache>d</korrSprache>
            <geschlecht>m</geschlecht>
            <name>Peter</name>
            <vorname>Muster</vorname>
          </debitor>
          <positionen>
            ...
            ...
            ...
          </positionen>
        </beleg>
     
      </belege>

    Ich möchte jetzt eine Ausgabe tätigen, und zwar möchte ich zum Beispiel die Anrede, den Namen, den Vornamen und die BelegID von dem Beleg der Abteilung B.

    Also falls im XML als Geschlecht "m" eingetragen ist, soll die Ausgabe "Herr" sein..:

    Herr
    Muster Peter
    888
    Wie kann ich das am besten machen? Wie kann ich nur die Attribute der Abteilung "B" ansprechen?

    Bitte um hilfe...

    Danke vielmals!
    banshe
     

  2. #2
    Martin Honnen Martin Honnen ist offline Mitglied Bronze
    Registriert seit
    Dec 2011
    Beiträge
    30
    Mit XSLT 2.0 (also etwa mit Saxon 9 oder mit AltovaXML)
    Code xml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    <xsl:template match="/">
      <xsl:apply-templates select="//beleg[abteilung = 'B']"/>
    </xsl:template>
     
    <xsl:template match="beleg">
      <xsl:apply-templates select="debitor, belegID"/>
    </xsl:template>
     
    <xsl:template match="debitor">
      <xsl:apply-templates select="geschlecht">
      <xsl:value-of select="name, vorname" separator=" "/>
    </xsl:template>
     
    <xsl:template match="debitor/geschlecht[. = 'm']">
      <xsl:text>Herr </xsl:text>
    </xsl:template>
     
    <xsl:template match="debitor/geschlecht[. = 'w']">
      <xsl:text>Frau </xsl:text>
    </xsl:template>

    So als Ergebnis nicht einfach nur Text, sondern HTML oder wieder XML erstellt werden soll, muss man halt noch Resultatselemente einfügen, aber du hast uns keinerlei Details zum Ausgabeformat mitgeteilt, also belasse ich es bei einfachem Text.
    banshe bedankt sich. 

  3. #3
    banshe banshe ist offline Mitglied Silber
    Registriert seit
    Mar 2010
    Beiträge
    58
    Hallo Martin Honnen

    Vielen Dank für deine Antwort.

    Schlussendlich werde ich das ganze in HTML ausgeben. Die Vorgabe ist das ganze mit XSLT 1.0 zu lösen. Das ist wahrscheinlich auch der Grund für einige Fehlermeldungen die ich bekomme wenn ich deinen Code einbaue.

    Beispielsweise erhalte ich bei folgender Zeile 40:
    Code :
    1
    2
    3
    
    39: <xsl:template match="debitor">
    40:   <xsl:value-of select="name, vorname" separator=" "/>
    41: </xsl:template>

    folgende Fehlermeldung:
    Fehlerlevel: error
    Beschreibung: Attribute separator is not allowed on this element
    Anfang: 40:0
    Wie kann ich das ganze in XSLT 1.0 realisieren?

    Vielen Dank und Gruss
     

  4. #4
    Martin Honnen Martin Honnen ist offline Mitglied Bronze
    Registriert seit
    Dec 2011
    Beiträge
    30
    Mit XSLT 1.0 braucht man etwas mehr Code:
    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
    
    <xsl:template match="/">
      <xsl:apply-templates select="//beleg[abteilung = 'B']"/>
    </xsl:template>
     
    <xsl:template match="beleg">
      <p>
        <xsl:apply-templates select="debitor"/>
        <br/>
        <xsl:apply-templates select="belegID"/>
      </p>
    </xsl:template>
     
    <xsl:template match="debitor">
      <xsl:apply-templates select="geschlecht">
      <br/>
      <xsl:value-of select="concat(name, ' ', vorname)"/>
    </xsl:template>
     
    <xsl:template match="debitor/geschlecht[. = 'm']">
      <xsl:text>Herr</xsl:text>
    </xsl:template>
     
    <xsl:template match="debitor/geschlecht[. = 'w']">
      <xsl:text>Frau</xsl:text>
    </xsl:template>
    Ich habe auch etwas HTML eingebaut, nur als Beispiel, eventuell ist die Verwendung einer Tabelle oder Liste sinnvoller als die eines Paragrafen mit Zeilenumbrüchen, aber das solltest du anpassen können. Falls nicht, poste mal das HTML, das aus den Eingabedaten erzeugt werden soll.
    banshe bedankt sich. 

  5. #5
    banshe banshe ist offline Mitglied Silber
    Registriert seit
    Mar 2010
    Beiträge
    58
    Hallo und vielen Dank für deine Hilfe!

    Mein XSLT Code sieht derzeit wie folgt aus:

    Code :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:template match="/">
            <xsl:apply-templates select="//beleg[belegID = '888']"/>
        </xsl:template>
     
        <xsl:template match="beleg">
            <p>
                <xsl:apply-templates select="debitor"/>
                <xsl:apply-templates select="belegID"/>
            </p>
        </xsl:template>
     
        <xsl:template match="debitor/geschlecht[. = 'm']">
            <xsl:text>Herr</xsl:text>
        </xsl:template>
     
        <xsl:template match="debitor/geschlecht[. = 'w']">
            <xsl:text>Frau</xsl:text>
        </xsl:template>
     
        <xsl:template match="debitor">
            <xsl:apply-templates select="geschlecht"/>
            <br/>
            <xsl:value-of select="concat(name, ' ', vorname)"/>
            <br/>
            <xsl:value-of select="strasse"/>
            <br/>
            <xsl:value-of select="concat(plz, ' ', ort)"/>
            <br/>
            <xsl:text>Ortschaft, </xsl:text>
            <xsl:value-of select="datum"/>
            <br/>
            <xsl:text>Beleg</xsl:text>
            <br/>
            <xsl:text>Kunden Nr.</xsl:text>
            <br/>
            <xsl:value-of select="personID"/>
            <br/>
            <xsl:text>Beleg Nr.</xsl:text>
            <br/>
        </xsl:template>
    </xsl:stylesheet>

    Als Ausgabe erhalte ich folgendes:
    Herr
    Muster Peter
    Strassenname
    PLZ Ort
    Ortschaft, 2012-01-01T10:00:00
    Rechnung
    Kunden Nr.
    33
    888
    Mit der Ausgabe bin ich zufrieden. Nur weiss ich nicht weiter...
    Die "BelegID" hole ich aus der Ebene über "Debitor".. also aus der Ebene "Rechnung". Und zwar mit dem Teil:
    Code :
    1
    2
    3
    4
    5
    6
    
        <xsl:template match="rechnung">
            <p>
                <xsl:apply-templates select="debitor"/>
                <xsl:apply-templates select="belegID"/>
            </p>
        </xsl:template>

    Wie kann ich nach der BelegID weitere Attribute aus der Ebene "Debitor" holen?

    Ich habe auch folgendes Versucht:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
        <xsl:template match="beleg">
            <p>
                <xsl:apply-templates select="debitor"/>
                <xsl:apply-templates select="beleg"/>
            </p>
        </xsl:template>
     
    ...
    ...
    ...
     
        <xsl:template match="beleg">
            <xsl:apply-templates select="belegID"/>
            <br/>
            <xsl:text>Beleg Nr.</xsl:text>
            <br/>
            <xsl:value-of select="belegID"/>
        </xsl:template>

    Aber das gibt mir dann nurnoch folgendes aus:
    888
    Beleg Nr.
    888
    Der ganze Rest ist weg... ich verstehe die Logik dahinter nicht wirklich... was verstehe ich falsch?

    Ah und btw.:
    Das Attribut "datum" hat folgenden Wert, welcher auch ausgegeben wird: "2012-01-01T10:00:00"
    Ist es möglich bei der Ausgabe nur die ersten 10 Ziffern anzuzeigen und die letzten 9 Ziffern zu löschen?

    Ist es möglich das Aktuelle Datum anzuzeigen? Eine Art TimeStamp?


    Vielen vielen Dank und Gruss...
    banshe
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.
    Zitat Zitat von banshe Beitrag anzeigen
    Die "BelegID" hole ich aus der Ebene über "Debitor".. also aus der Ebene "Rechnung". Und zwar mit dem Teil:
    Code :
    1
    2
    3
    4
    5
    6
    
        <xsl:template match="rechnung">
            <p>
                <xsl:apply-templates select="debitor"/>
                <xsl:apply-templates select="belegID"/>
            </p>
        </xsl:template>

    Wie kann ich nach der BelegID weitere Attribute aus der Ebene "Debitor" holen?

    Ich habe auch folgendes Versucht:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
        <xsl:template match="beleg">
            <p>
                <xsl:apply-templates select="debitor"/>
                <xsl:apply-templates select="beleg"/>
            </p>
        </xsl:template>
     
    ...
    ...
    ...
     
        <xsl:template match="beleg">
            <xsl:apply-templates select="belegID"/>
            <br/>
            <xsl:text>Beleg Nr.</xsl:text>
            <br/>
            <xsl:value-of select="belegID"/>
        </xsl:template>
    Du hast hier zwei Templates mit dem gleichen Muster geschrieben. Oder wie soll ich den Code verstehen?

    Nur das Template mit der besten Übereinstimmung wird auch angewandt.
    Zitat Zitat von banshe Beitrag anzeigen
    Der ganze Rest ist weg... ich verstehe die Logik dahinter nicht wirklich... was verstehe ich falsch?
    Etwas anderes macht dein Template doch nicht... Ich verstehe nicht was du stattdessen erwartet hast.
    Zitat Zitat von banshe Beitrag anzeigen
    Ah und btw.:
    Das Attribut "datum" hat folgenden Wert, welcher auch ausgegeben wird: "2012-01-01T10:00:00"
    Ist es möglich bei der Ausgabe nur die ersten 10 Ziffern anzuzeigen und die letzten 9 Ziffern zu löschen?
    Ja, mit der XPath Function substring.
    Zitat Zitat von banshe Beitrag anzeigen
    Ist es möglich das Aktuelle Datum anzuzeigen? Eine Art TimeStamp?
    Nein, nur mit Erweiterungsfunktionen.

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

  7. #7
    banshe banshe ist offline Mitglied Silber
    Registriert seit
    Mar 2010
    Beiträge
    58
    Hallo und Danke für die Antwort.

    Du hast hier zwei Templates mit dem gleichen Muster geschrieben. Oder wie soll ich den Code verstehen?
    ...
    ...
    Etwas anderes macht dein Template doch nicht... Ich verstehe nicht was du stattdessen erwartet hast.
    Wie gesagt, ich bin frisch in XSLT und weiss solche sachen nicht.. Ich muss XSLT auch in keinem hohen Niveau kennen, ich brauche einzig die Grundlagen.

    Bei meinem Problem(chen) komme ich leider immernoch nicht weiter.
    Einfacher formuliert:

    Wie kann ich aus diesem XML:
    Code :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    
    <job>
      <jobDatum>2012-01-01T12:00:00</jobDatum>
     
      <belege>
     
        <!-- Abteilung A-->
     
        <beleg>
          <belegID>999</belegID>
          <abteilung>A</abteilung>
          <anz>20</anz>
          <text>Test Text</text>
     
          <debitor>
            <personID>89</personID>
            <korrSprache>d</korrSprache>
            <geschlecht>m</geschlecht>
            <name>Peter</name>
            <vorname>Muster</vorname>
            <strasse>Langstrasse 1</strasse>
            <ort>80331 München</ort>
          </debitor>
     
          <positionen>
            <positionID>1</positionID>
            <betrag>100</betrag>
            <text>Belegtext</text>
          </positionen>
     
          <positionen>
            <positionID>2</positionID>
            <betrag>200</betrag>
            <text>Belegtext</text>
          </positionen>
        </beleg>
     
     
     
     
        <!-- Abteilung B-->
     
        <beleg>
          <belegID>888</belegID>
          <abteilung>A</abteilung>
          <anz>20</anz>
          <text>Test Text</text>
     
          <debitor>
            <personID>86</personID>
            <korrSprache>d</korrSprache>
            <geschlecht>m</geschlecht>
            <name>Fanz</name>
            <vorname>Rohr</vorname>
            <strasse>Kurzstrasse 1</strasse>
            <ort>80331 München</ort>
          </debitor>
     
          <positionen>
            <positionID>3</positionID>
            <betrag>300</betrag>
            <text>Belegtext</text>
          </positionen>
     
          <positionen>
            <positionID>4</positionID>
            <betrag>5500</betrag>
            <text>Belegtext</text>
          </positionen>
        </beleg>
      </belege>
    </job>

    Folgende Ausgabe (Alles aus der "Abteilung B"):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    Herr     //Kommt aus dem "m" heraus
    Franz Rohr
    Kurzstrasse 1
    80331 München
    München, 2012-01-01     //Kommt aus <ort> und <jobDatum> heraus
    86     //<personID>
    888     //<belegID>
    Belegtext 3
    300     //<betrag>
    Belegtext 4
    5500     //<betrag>
    20     //<anz>


    Irgendwie fehlt mir das Verständniss für XSLT...
    Vielen vielen Dank für die Hilfe!!

    Gruss
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.

    Du solltest dich evtl. erstmal mit XPath befassen. Dein Problem ist ziemlich simpel, mehr als Grundlagen braucht man dafür nicht.

    Code xml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    <xsl:template match="beleg[abteilung = 'B']">
      <xsl:value-of select="debitor/vorname" /> <xsl:value-of select="debitor/name" />
      <xsl:value-of select="debitor/strasse" />
      ...
     
      <xsl:for-each select="positionen">
        <xsl:value-of select="text" /> <xsl:value-of select="positionID" />
        <xsl:value-of select="betrag" />
      </xsl:for-each>
    <xsl:template>
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    banshe banshe ist offline Mitglied Silber
    Registriert seit
    Mar 2010
    Beiträge
    58
    Hallo deepthroat

    Danke für deine Antwort. Ich habe dies soeben ausprobiert.
    Wenn ich genau deinen Code verwende:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:template match="beleg[abteilung = 'B']">
            <xsl:value-of select="debitor/vorname"/>
            <xsl:value-of select="debitor/name"/>
            <xsl:value-of select="debitor/strasse"/>
     
            <xsl:for-each select="positionen">
                <xsl:value-of select="text"/>
                <xsl:value-of select="positionID"/>
                <xsl:value-of select="betrag"/>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>

    bekomme ich das ganze XML als Resultat:
    Code :
    1
    
    2012-01-01T12:00:00 999 A 20 Test Text 89 d m Peter Muster Langstrasse 1 80331 München 1 100 Belegtext 2 200 Belegtext 888 A 20 Test Text 86 d m Fanz Rohr Kurzstrasse 1 80331 München 3 300 Belegtext 4 5500 Belegtext

    Habe ich etwas falsch gemacht?

    Danke und Gruss
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von banshe Beitrag anzeigen
    Habe ich etwas falsch gemacht?
    Ja. Du hast falsche Daten eingegeben. Es gibt bei dir keine Abteilung "B".

    Und Textknoten werden standardmäßig ausgegeben. Das ist normal.

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

  11. #11
    banshe banshe ist offline Mitglied Silber
    Registriert seit
    Mar 2010
    Beiträge
    58
    Ups, da hat sich ein Fehler in mein XML eingeschlichen. Habe jetzt das "B" in der zweiten Abteilung ergänzt.

    Das Resultat ist jedoch fast immernoch das gleiche:
    Code :
    1
    
    2012-01-01T12:00:00 999 A 20 Test Text 89 d m Peter Muster Langstrasse 1 80331 München 1 100 Belegtext 2 200 Belegtext RohrFanzKurzstrasse 1Belegtext3300Belegtext45500

    Wieso bekomme ich auch alle Angaben aus der Abteilung A?

    Gruss
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von banshe Beitrag anzeigen
    Wieso bekomme ich auch alle Angaben aus der Abteilung A?
    Wie bereits gesagt: weil standardmäßig alle Textknoten ausgegeben werden.

    Gib einfach ein Template an, welches das verhindert.

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

  13. #13
    banshe banshe ist offline Mitglied Silber
    Registriert seit
    Mar 2010
    Beiträge
    58
    Zitat Zitat von deepthroat Beitrag anzeigen
    Gib einfach ein Template an, welches das verhindert.
    Und kannst du mir dabei behilflich sein wie man das macht?

    Merci und Gruss
     

  14. #14
    Martin Honnen Martin Honnen ist offline Mitglied Bronze
    Registriert seit
    Dec 2011
    Beiträge
    30
    Zitat Zitat von banshe Beitrag anzeigen
    Und kannst du mir dabei behilflich sein wie man das macht?
    Ein leeres Template für Textknoten reicht:
    Code :
    1
    
    <xsl:template match="text()" />
     

Ähnliche Themen

  1. Bestimmten Teil (Bildlink) ersetzen
    Von tvtotal im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 15.03.10, 10:23
  2. Nur bestimmten teil ausgeben?
    Von MrHankey im Forum PHP
    Antworten: 3
    Letzter Beitrag: 11.08.04, 20:00
  3. Bestimmten Teil suchen und übergeben?
    Von Create im Forum PHP
    Antworten: 3
    Letzter Beitrag: 17.07.02, 21:38
  4. Bestimmten Frame ansprechen
    Von ollek81 im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 03.05.02, 08:54
  5. Bestimmten Teil suchen und ignorieren
    Von ExAByte im Forum PHP
    Antworten: 1
    Letzter Beitrag: 09.02.02, 00:06