String durch "-" Trennen, Datum
Raspu
- xsl
Hallo an alle.
Ich habe 3 Variablen die ich zu einer neuen zusammenführen möchte. Diese sollen jetzt aber nicht durch Leerzeichen sondern durch "-" getrennt werden.
Es dürfen nirgens zwischendurch Leerzeichen erzeigt werden.
z.B.
2003-12-01
aber nicht
2003-12-01
und auch nicht
2003 - 12 - 01
-----------------------------------------
Ich habe eine XML in der mehre Daten (Mehrzahl von Datum) gegeben sind.
Allerdings im Deutschen Format: TT.MM.JJJJ
XSL rechnet mir aber nur die Differenz zwischen diesem Tag und dem heutigen aus, wenn ich ihm das ganze im Format JJJJ-MM-TT gebe.
Daher habe ich 3 Funktionen generiert die mir den Tag, den Monat und das Jahr auslesen. Jetzt bekomme ich sie aber, wie oben beschrieben nicht richtig zusammengesezt. Er fügt mir immer Leerzeichen ein, wodurch ich das ganze nicht als xs:data casten kann.
Hilfe!
Raspu
Hallo Raspu,
Ich habe 3 Variablen die ich zu einer neuen zusammenführen möchte. Diese sollen jetzt aber nicht durch Leerzeichen sondern durch "-" getrennt werden.
Es dürfen nirgens zwischendurch Leerzeichen erzeigt werden.
Wenn diese Variablen beispielsweise $t, $m und $j lauten und führender oder nachfolgender Lerraum vorkommt, dann gehe so vor:
<xsl:value-of select="concat(normalize-space($j),'-',normalize-space($m),'-',normalize-space($t))"/>
Grüße,
Thomas
Hallo Raspu,
Das hab ich schon versucht:
Wenn diese Variablen beispielsweise $t, $m und $j lauten und führender oder nachfolgender Lerraum vorkommt, dann gehe so vor:
<xsl:value-of select="concat(normalize-space($j),'-',normalize-space($m),'-',normalize-space($t))"/>
Er hat mir trotzdem nach dem 1. '-' ein Leerzeichen eingefügt. Somit kann ich es nicht in ein xs:date überführen.
Aber danke
Raspu
Hat nicht noch jemand eine Idee.
Raspu
Hallo Raspu,
Hat nicht noch jemand eine Idee.
Vielleicht, wenn Du auch mal einen relevanten Teil vom XML-/XSL-Code zeigen würdest.
Grüße,
Thomas
Bitte schön:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns="http://earth.google.com/kml/2.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ont="http://www.w3.org/1999/XSL/ont"
xmlns:rdf="http://www.w3.org/1999/XSL/rdf"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:fb="http://www.w3.org/23"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tm="http://www.datenverdrahten.de/tm">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<kml>
<Document>
<visibility>0</visibility>
<open>1</open>
<xsl:apply-templates/>
</Document>
</kml>
</xsl:template>
<xsl:template match="ontratedDisease">
<xsl:for-each select="ontDisease">
<xsl:variable name="heute" select="xs:date(fn:current-date())"/>
<Folder>
<visibility>0</visibility>
<open>0</open>
<name><xsl:value-of select="ontdiseaseName"/></name>
<xsl:for-each select="onthasVierWRating/ontVierWRating">
<xsl:variable name="vergangen" select="./ontlastTimeDiagnosed"/>
<xsl:variable name="Tag">
<xsl:choose>
<xsl:when test="substring($vergangen,2,1)='.'">
0<xsl:value-of select="normalize-
space(substring($vergangen,1,1))"/>
</xsl:when>
<xsl:otherwise> <!--test="substring(vergangen,1,1)='2'">-->
<xsl:value-of select="normalize-
space(substring($vergangen,1,2))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="Monat">
<xsl:choose>
<xsl:when test="substring($vergangen,2,1)='.' and
substring($vergangen,4,1)='.'">
0<xsl:value-of select="normalize-
space(substring($vergangen,3,1))"/>
</xsl:when>
<xsl:when test="substring($vergangen,2,1)='.'">
<xsl:value-of select="normalize-
space(substring($vergangen,3,2))"/>
</xsl:when>
<xsl:when test="substring($vergangen,3,1)='.' and
substring($vergangen,5,1)='.'">
0<xsl:value-of select="normalize-
space(substring($vergangen,4,1))"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="normalize-
space(substring($vergangen,4,2))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="Jahr">
<xsl:choose>
<xsl:when test="substring($vergangen,2,1)='.' and
substring($vergangen,4,1)='.'">
<xsl:value-of select="normalize-
space(substring($vergangen,5,4))"/>
</xsl:when>
<xsl:when test="substring($vergangen,2,1)='.'">
<xsl:value-of select="normalize-
space(substring($vergangen,6,4))"/>
</xsl:when>
<xsl:when test="substring($vergangen,3,1)='.' and
substring($vergangen,5,1)='.'">
<xsl:value-of select="normalize-
space(substring($vergangen,6,4))"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="normalize-
space(substring($vergangen,7,4))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="Datum" select="concat(normalize-space($Jahr),
('-'),normalize-space($Monat),('-'),normalize-space($Tag))"/>
<xsl:variable name="Datum1" select="$Datum"/>
Tag:<xsl:value-of select="$Tag"/>
Monat:<xsl:value-of select="$Monat"/>
Jahr:<xsl:value-of select="$Jahr"/>
heute:<xsl:value-of select="(xs:date($heute))"/>
Die nächste Zeile funktioniert jetzt aber nicht. Da er es nicht als Datum erkennt.~~~xml
Differenz der Tage <xsl:value-of select="fn:days-
from-duration($heute - xs:date($Datum))"/>
</xsl:for-each>
</Folder>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Zu der XML Datei gibt es nicht viel zu sagen.
Der auszulesende Wert liegt in dieversen Unterordnern die an der Struktur der XSL erkennbar sein sollten:
<ontlastTimeDiagnosed rdf:datatype="&xsd;
date">22.5.2006</ontlastTimeDiagnosed>
Wenn ihr noch was wissen wollt. Immer her mit den Fragen.
Raspu
Hallo Raspu,
Die nächste Zeile funktioniert jetzt aber nicht. Da er es nicht als Datum erkennt.~~~xml
Differenz der Tage <xsl:value-of select="fn:days-
from-duration($heute - xs:date($Datum))"/>
Irgendetwas ist an Deinen Daten "unsauber", prüfe mal die Variableninhalte auf String vs. Number. Dieser statische Test funktioniert problemlos:
~~~xml
<xsl:template match="/">
<xsl:variable name="Jahr" select="'2009'"/>
<xsl:variable name="Monat" select="'03'"/>
<xsl:variable name="Tag" select="'16'"/>
<xsl:variable name="Datum" select="fn:concat(fn:normalize-space($Jahr),'-',fn:normalize-space($Monat),'-',fn:normalize-space($Tag))"/>
<xsl:value-of select="fn:days-from-duration(fn:current-date() - xs:date($Datum))"/><!-- 9 -->
</xsl:template>
Grüße,
Thomas
Ich weiß leider nicht, wie ich die Variableninhalte prüfen kann.
Und auch nicht wie ich sie umschreiben könnte.
Raspu
Hallo Raspu,
Ich weiß leider nicht, wie ich die Variableninhalte prüfen kann.
Durch Testen auf passende Schema-Typen mittels:
<xsl:value-of select="$var instance of xs:string"/>
Und auch nicht wie ich sie umschreiben könnte.
Ändere mal die Stellen mit den hinzugefügten Nullen so ab:
<xsl:when test="substring($vergangen,2,1)='.' and substring($vergangen,4,1)='.'">
<xsl:value-of select="concat('0',normalize-space(substring($vergangen,3,1)))"/>
</xsl:when>
Grüße,
Thomas
Hallo,
dank dir Thomas. Aber es hat leider auch nichts gebracht.
Ich habe jetzt mal übers Wochenende einen Datensatz erstellt der das Datum so enthält, wie XPath 2.0 bzw XSLT 2.0 es gerne hätten (JJJJ-MM-TT). Ich musste aber feststellen das es hier genauso wenig funktioniert.
Ich bin ein wenig ratlos.
Hat denn jemand noch eine Idee?
Raspu
Das ist im übrigen die Fehlermeldung die kommt.
Error in XPath 2.0 expression at xsl:value-of - select
C:\Dokumente und Einstellungen\Swantja\Desktop\Datum.xsl
Line 90, Character 36
Type doesn't support operator - -
Ich arbeite mit Altova XML
Hallo,
Das ist im übrigen die Fehlermeldung die kommt.
Error in XPath 2.0 expression at xsl:value-of - select
C:\Dokumente und Einstellungen\Swantja\Desktop\Datum.xsl
Line 90, Character 36Type doesn't support operator - -
Das deutet aber darauf hin, dass du in einem deiner XPath-Ausdrücke einen Fehler hast. Überprüfe sie nochmal. Zeichen für Zeichen!
Grüße
Thomas
Hallo,
den Code funtioniert solange ich as="xs:date()" weglasse. Somit liegt es nicht direkt am Aufbau des Value-of select.
Das heißt es müsste an dem xs:date() liegen. Aber so wie ich es benutze habe, habe ich es auch auf vielen Webseiten und in Büchern gefunden.
Raspu
Hallo Raspu,
den Code funtioniert solange ich as="xs:date()" weglasse. Somit liegt es nicht direkt am Aufbau des Value-of select.
Das heißt es müsste an dem xs:date() liegen. Aber so wie ich es benutze habe, habe ich es auch auf vielen Webseiten und in Büchern gefunden.
Ist der nötige Schema-Namensraum xmlns:xs="http://www.w3.org/2001/XMLSchema" im Stylesheet deklariert?
Grüße,
Thomas
Ist der nötige Schema-Namensraum xmlns:xs="http://www.w3.org/2001/XMLSchema" im Stylesheet deklariert?
Ja ist er.
Raspu
Hallo Raspu,
»» Ist der nötige Schema-Namensraum xmlns:xs="http://www.w3.org/2001/XMLSchema" im Stylesheet deklariert?
Ja ist er.
Dann fällt mir auch fast nichts mehr ein, außer die XSLT 2.0-Option zu prüfen (bei AltovaXML mittels Parameter -xslt2 ) und mal meine Testbeispiele für Datum/Zeit zu probieren (gegen ein dummy.xml wie <root/>
prozessieren).
Grüße,
Thomas
Hallo,
<xsl:variable name="Datum" select="concat(normalize-space($Jahr),
('-'),normalize-space($Monat),('-'),normalize-space($Tag))"/>
Unter Umständen einfach nochmal ein format-date($Datum, "[Y]-[M]-[D]") benutzen.
Grüße
Thomas
Hallo Raspu,
hier noch ein vereinfachter Ansatz zur Umwandlung des Datums mit den offenbar möglichen XSLT/XPath 2.0-Techniken:
<xsl:variable name="vergangen" select="./ontlastTimeDiagnosed"/><!-- 22.5.2006 -->
<xsl:variable name="datum_tmj" select="fn:tokenize($vergangen,'\.')"/>
<xsl:variable name="datum_jmt" select="fn:concat($datum_tmj[3],'-',
if(fn:string-length($datum_tmj[2]) eq 1) then fn:concat('0',$datum_tmj[2]) else $datum_tmj[2],'-',
if(fn:string-length($datum_tmj[1]) eq 1) then fn:concat('0',$datum_tmj[1]) else $datum_tmj[1])"/>
<xsl:value-of select="$datum_jmt"/><!-- 2006-05-22 -->
Differenz der Tage <xsl:value-of select="fn:days-from-duration(fn:current-date() - xs:date($datum_jmt))"/><!-- 1039 -->
Grüße,
Thomas