Raspu: String durch "-" Trennen, Datum

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

  1. 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

    1. 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

      1. Hat nicht noch jemand eine Idee.

        Raspu

        1. 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

          1. 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="&amp;xsd;  
              date">22.5.2006</ontlastTimeDiagnosed>  
              
            Wenn ihr noch was wissen wollt. Immer her mit den Fragen.  
              
            Raspu
            
            1. 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

              1. Ich weiß leider nicht, wie ich die Variableninhalte prüfen kann.
                Und auch nicht wie ich sie umschreiben könnte.

                Raspu

                1. 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

                  1. 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

                    1. 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

                      1. 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 36

                        Type 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

                        1. 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

                          1. 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

                            1. Ist der nötige Schema-Namensraum xmlns:xs="http://www.w3.org/2001/XMLSchema" im Stylesheet deklariert?

                              Ja ist er.

                              Raspu

                              1. 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

            2. 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

            3. 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