Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

1

25.10.2012, 18:46

SVG (in XML gespeichert) mittels XSLT umwandeln

Huhu Leuts,

ich sitze momentan an einem kleinen Problem, habe kaum bis keine XML/XSLT Erfahrung und bräuchte da mal eine helfende Hand.
Ziel ist, folgende Datei:

Quellcode

1
2
3
4
    <?xml version="1.0" ?>
    <svg xmlns="http://www.w3.org/2000/svg">
            <rect x="0" y="0" width="180" height="180" fill="white"/>
    </svg>


mittels XSLT in folgende zu verwandeln:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
    <?xml version="1.0" encoding="UTF-8"?>
    <svg xmlns="http://www.w3.org/2000/svg">
            <rect x="0" y="0" width="60" height="60" fill="white"/>
            <rect x="60" y="0" width="60" height="60" fill="white"/>
            <rect x="120" y="0" width="60" height="60" fill="white"/>
            <rect x="0" y="60" width="60" height="60" fill="white"/>
            <rect x="120" y="60" width="60" height="60" fill="white"/>
            <rect x="0" y="120" width="60" height="60" fill="white"/>
            <rect x="60" y="120" width="60" height="60" fill="white"/>
            <rect x="120" y="120" width="60" height="60" fill="white"/>
    </svg>


Bisher sieht meine xsl-Datei so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="xml" />
    
    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>
    
</xsl:stylesheet>


Was ich machen möchte:

  • Die width- und height-Attribute aus der Ursprungsdatei auslesen, durch 3 teilen und in den neuen Rects speichern.
  • Die x- und y-Attribute anpassen (In anderen Sprachen, wie Java oder C++ könnte man das ja einfach über eine Schleife lösen, aber wie gesagt, mit XSLT habe ich keine Erfahrung und weiß nicht genau, wie ich das bewerkstelligen soll)

Danke im Voraus

Nim
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

25.10.2012, 18:57

Sieht für mich stark nach Bundeswettbewerb für Informatik aus:

Seite zwei:
http://www.bundeswettbewerb-informatik.d…11_Aufgaben.pdf

Bei der eigentlichen Fragestellung kann ich leider nicht weiterhelfen.
Ich habe selber noch nie mit XSLT gearbeitet.

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

3

25.10.2012, 18:59

Ja, ist aus dem BWInf, ich habe jetzt fast 2 Stunden gegoogelt, aber nichts gefunden, womit man Attribute per Formel ändern kann, Recherche (auch in Foren) ist beim BWInf durchaus erlaubt, man darf nur keine ganzen Programme oder Teile von ihnen nutzen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

25.10.2012, 19:12

Klingt, als hättest du da einen Denkfehler. Mit XSLT verändertst du nicht irgendeine Struktur, du transformierst eine XML Struktur in eine neue XML Struktur. Du willst nicht vorhandene Attribute ändern, du willst die richtigen Nodes und Attribute generieren. Schaut z.B. viellecht mal hier: http://www.xml.com/pub/a/2001/05/07/xsltmath.html

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

5

26.10.2012, 15:26

In dem Fall muss ich das ganze aber nunmal verändern, bzw. aus der alten Stufe die neue erstellen, das ist ja die Aufgabe (Aus einer beliebigen Iterationsstufe des Sierpinski-Teppichs mithilfe von XSL die nächste generieren).

Ich habe jetzt mal versucht, den width-Wert am Anfang in einer Variable zu speichern und dann am Ende jedem Rect wieder zuzuweisen.

In var wird sogar ein Wert gespeichert, allerdings beträgt dieser nicht 180, sondern

">
" (> + Zeilenumbruch + Tabstopp). Kann mir das jemand erklären?

XSL sieht jetzt so aus:

Quellcode

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"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="xml" />
    
    <xsl:variable name="var">
        <xsl:value-of select="svg/rect/@width"/>>
    </xsl:variable>
    
    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>
    
    
    
    <xsl:template match="@width">
      <xsl:attribute name="width">
        <xsl:value-of select="$var"/>
      </xsl:attribute>
    </xsl:template>
    
</xsl:stylesheet>
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

6

26.10.2012, 16:23

In der Variable steht ein ">" zuviel.

Die Variable ist aber auch gar nicht notwendig. So geht's auch:

XML

1
2
3
4
5
<xsl:template match="@width|@height">
    <xsl:attribute name="{name()}">
        <xsl:value-of select="number(.) div 3"/>
    </xsl:attribute>
</xsl:template>

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

7

27.10.2012, 01:18

Da ich XML/XSLT ja gerade "lerne", geh ich diesen Codeblock nochmal durch und schreibe, was ich unter jeder Zeile verstehe, korrigiert mich bitte, wenn ich irgendwo falsch liege :)

XML

1
2
3
4
5
<xsl:template match="@width|@height"> <!-- Für jedes width- oder height-Attribut... -->
    <xsl:attribute name="{name()}"> <!-- Erstelle ein Attribut des selben Namens (und überschreibe damit das alte) im Element... -->
        <xsl:value-of select="number(.) div 3"/> <!-- Und weise ihm dessen Wert geteilt durch 3 zu. -->
    </xsl:attribute>
</xsl:template>


Passt das soweit?

Jetzt bleibt nur noch die Frage, wie ich das mit dem Schrittweisen Verändern der x- und y-Attribute machen soll.
Rein von der Syntax/ den XSL-Elementen springt da natürlich for-each in mein Auge.

Hier muss ich jetzt denke ich mit einer Variablen arbeiten, die anfangs auf 0 gesetzt ist, dann jedes Mal um width/3 erhöht wird, und nach dem dritten Durchgang wieder auf 0 gesetzt wird (für x) und außerdem, wenn y "in der zweiten Reihe liegt", den 2. Schritt überspringt.

Kann mir da jemand einen Anstoß zu geben? Wie gesagt, die XML-/XPath-Syntax ist komplettes Neuland für mich und ich verstehe solche neuen Dinge meist am schnellsten durch Beispiele.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

14.11.2012, 22:24

So, ich hatte zu wenig Zeit, mich noch in XML/XPath und die XSLT Syntax einzuarbeiten, deswegen versuche ich es jetzt mit Java, wo ich mich zumindest ein wenig auskenne^^

Das Programm sieht so aus: http://pastebin.com/U7c6jxC2

Der 1. Input so: http://pastebin.com/PD36Bs2X

Der 1. Output / 2. Input so: http://pastebin.com/J9hkQ66N

Bis hierhin klappt alles, das Rect wird durch 8 neue Rects ersetzt und am Ende gelöscht.

Wenn ich diesen Output jetzt wieder in das Programm schmeiße, bekomme ich aber: http://pastebin.com/njJSk0jB

Hier wird nur das 1. Rect (wieder nach Plan ersetzt), danach hört das Programm aber auf. Mit dem Debugger bin ich dem ganzen nicht wirklich auf die Schliche gekommen, er springt einfach nach dem ersten ersetztem Rect aus der Schleife raus und erstellt das neue Dokument.

Kann mir da jemand einen Tipp geben, wo das Problem liegt?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

9

16.11.2012, 00:11

Schon gut, habe das Problem inzwischen selbst gelöst, ihr müsst mir nicht mehr helfen xD

Da ich eine genau Lösung nicht jetzt schon hier abgeben will/darf, warte ich damit ein bisschen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige