Andi: Syntaxfehler?

Hallo zusammen,

ich schreibe gerade an einem XSLT- Stylesheet. Gestern ist mir aufgefallen, das ich versehentlich bei der XSLT- Version 1.0 angegeben habe. Ich habe dann einfach die Versionsnummer in 2.0 geändert, allerdings bekam ich dann einige Fehlermeldung in Bezug auf die bei Rechnungen verwendeten Datentypen für die Zeilen 2 und 4 im ersten Auszug des Stylesheets.
Ich verwende den xSLT- Przessor Saxon, Version 8.4.

Ein Auszug aus meinem alten Stylesheet sieht so aus:

<xsl:variable name="bound_x" select="substring-before(BPlanAuszug/wfs:FeatureCollection/gml:boundedBy/gml:Envelope/gml:pos[position()=1],' ')"/>
<xsl:variable name="offset_x" select="substring($bound_x,1,2)*100000"/>
<xsl:variable name="bound_y" select="substring-after(BPlanAuszug/wfs:FeatureCollection/gml:boundedBy/gml:Envelope/gml:pos[position()=1],' ')"/>
<xsl:variable name="offset_y" select="substring($y1,1,2) * 100000"/>

Daraufhin habe ich das Stylesheet wie folgt abgeändert:

<xsl:variable name="bound_x" select="substring-before(BPlanAuszug/wfs:FeatureCollection/gml:boundedBy/gml:Envelope/gml:pos[position()=1],' ')"/>
<xsl:variable name="offset_x" select="substring($bound_x,1,2)"/>
<xsl:variable name="offset_x_num" select="number($offset_x)*100000"/>
<xsl:variable name="bound_y" select="substring-after(BPlanAuszug/wfs:FeatureCollection/gml:boundedBy/gml:Envelope/gml:pos[position()=1],' ')"/>
<xsl:variable name="offset_y" select="substring($y1,1,2) "/>
<xsl:variable name="offset_y_num" select="number($offset_y)*100000"/>

Die Fehlermldungen waren beseitigt. Mit "number" wollte ich die als Text im GML- File angegebenen Koordinaten in Zahlen umwandeln. Allerdings war meine Ausgabe in SVG leer, da alle Koordinaten in meinen SVG- Objekten als "not a number" transformiert wurden.

Is irgendwas besonders zu beachten, wenn man Text in Zahlen konvertiert?

Beste Grüße

andi

  1. Hi,

    Die Fehlermldungen waren beseitigt. Mit "number" wollte ich die als Text im GML- File angegebenen Koordinaten in Zahlen umwandeln. Allerdings war meine Ausgabe in SVG leer, da alle Koordinaten in meinen SVG- Objekten als "not a number" transformiert wurden.

    Laß Dir doch mal alle Deine Variablen ausgeben, damit Du eine Chance hast, zu erkennen, wo was schiefgeht.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Hallo,

    ich schreibe gerade an einem XSLT- Stylesheet. Gestern ist mir aufgefallen, das ich versehentlich bei der XSLT- Version 1.0 angegeben habe.

    Tja, das ist auch die Versionsnummer der aktuellen Spezifikation.

    Ich habe dann einfach die Versionsnummer in 2.0 geändert,

    Selber Schuld ;-) und außerdem ein "substring($bound_x,1,2)*100000" ist eigentlich schlechter Stil.

    allerdings bekam ich dann einige Fehlermeldung in Bezug auf die bei Rechnungen verwendeten Datentypen für die Zeilen 2 und 4 im ersten Auszug des Stylesheets.

    Is irgendwas besonders zu beachten, wenn man Text in Zahlen konvertiert?

    In XPath 1.0 gilt, dass bei Verwendung eines nummerischen Operators die Werte implizit zu Nummern konvertiert werden:
    nahmst du "foo-bar" galt (und gilt) das als ein Knoten mit dem Namen "foo-bar", nahmst du "foo - bar" galt das implizit als "number(foo) - number(bar)".

    Das ist eine der Inkompatibilitäten zwischen XPath 1.0 und XPath 2.0. Die implizite Konvertierung bei Argumenten in Funktionen wird nicht mehr durchgeführt (es gibt zwar eine Ausname), so das z.B. für substring(), substring-after(), substring-befor() die Argumente tatsächlicn Strings sein müssen. bzw. als String genommen werden. Deshalb liefert ein XSLT2-Prozessor einen Type-Error.
    Wie du festgestellt hast, kannst du das XPath 1.0 Verhalten mit expliziter Konvertierung - "number()" - fordern.

    Du kannst es aber verkürzen:
    <xsl:variable name="offset_y" select="number(substring($y1,1,2))*100000"/>

    Grüße
    Thomas

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/