Stil: Substring in XSL

Hallo

ich überführe ein XML-Format (rss) per XSL in ein anderes (prop)

dabei möchte ich aus z.b. <pubDate>Jun 19, 2008</pubDate>
eine anderes Zeitformat machen
nämlich etwa : <StartDate>2008-06-19T18:00:02-04:00</StartDate>

Der Zeit-anteil ist dabei unwichtig - es kommt aufs datum an.

Kann ich das Datum direkt umrechnen?

mein ansatz war nun folgender:

  
<xsl:variable name="start_tag"><xsl:value-of select="substring(pubDate, 5, 2)" /></xsl:variable>  
<xsl:variable name="start_monat"><xsl:value-of select="substring(pubDate, 1, 3)" /></xsl:variable>  
<xsl:variable name="start_jahr"><xsl:value-of select="substring(pubDate, 9, 4)" /></xsl:variable>  
  
<xsl:if test="$start_monat='Jan'"><xsl:variable name="start_monat_z">01</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Feb'"><xsl:variable name="start_monat_z">02</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Mar'"><xsl:variable name="start_monat_z">03</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Apr'"><xsl:variable name="start_monat_z">04</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='May'"><xsl:variable name="start_monat_z">05</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Jun'"><xsl:variable name="start_monat_z">06</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Jul'"><xsl:variable name="start_monat_z">07</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Aug'"><xsl:variable name="start_monat_z">08</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Sep'"><xsl:variable name="start_monat_z">09</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Oct'"><xsl:variable name="start_monat_z">10</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Nov'"><xsl:variable name="start_monat_z">11</xsl:variable></xsl:if>  
<xsl:if test="$start_monat='Dec'"><xsl:variable name="start_monat_z">12</xsl:variable></xsl:if>  
  
<xsl:variable name="start_date"><xsl:value-of select="$start_jahr" />-<xsl:value-of select="$start_monat_z" />-<xsl:value-of select="$start_tag" />T18:00:02-04:00</xsl:variable>  

und startdate gebe ich dann halt aus.

das funkltioniert aber wohl nicht. Die xsl-transformation bricht dann ab.
wo liegt da mein fehler?
Ohne diesen Abschnitt läufts durch.

PHP5

 $xslDom = new DOMDocument;  
 $xslDom->load($xsl_path);  
  
 # XML-Daten laden  
 $xmlDom = new DOMDocument;  
 $xmlDom->load($source_xml_path);  
  
 $xsl = new XsltProcessor;  
 $xsl->importStyleSheet($xslDom);  
  
 if ($strFileCont = $xsl->transformToXML($xmlDom)) {

Stil

  1. Hi Stil!

    Ich sehe 2 Dinge:

    1. 12 mal <if test = "..." /> <if test = "..." /> , von denen stets NUR EIN if ausgeführt werden kann. Es werden also stets alle 12 Prüfungen ausgeführt, obwohl nur eine Bedingung erfüllt werden kann. An dieser Stelle ist definitiv xsl:choose mit xsl:when die bessere Wahl.

    2. Die Nichtausführung deines XSL resultiert aus dem Variablenscope: die von dir in den <if /> blöcken definierte Variable start_monat_z hat außerhalb der if Anweisung keine Gültigkeit, sie ist also _nicht_ definiert in der Anweisung:

    <xsl:variable name="start_date"><xsl:value-of select="$start_jahr" />-<xsl:value-of select="$start_monat_z" />-<xsl:value-of select="$start_tag" />T18:00:02-04:00</xsl:variable>

    Die Lösung liegt darin, die if (oder besser choose/when) Anweisung _in_ die Variable zu legen (hier noch Beispiel mit if, ich bin faul):

    <xsl:variable name="start_monat_z">
      <xsl:if test="$start_monat='Jan'">01</xsl:if>
     ...
      <xsl:if test="$start_monat='Dec'">12</xsl:if>
    </xsl:variable>

    Grüße,
    Richard

    1. ahhh

      besten Dank! beiden Antwortern! Das war nicht nur sehr hilfreich sondern auch noch erleuchtend.

      thx
      Stil

  2. Hallo Stil,

    die Zuordnung von Monatsnamen zu Monatsnummern lässt sich auch etwas kompakter formulieren:

    <xsl:variable name="m_namen" select="'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec'"/>  
    <xsl:variable name="m_werte" select="'01 |02 |03 |04 |05 |06 |07 |08 |09 |10 |11 |12 '"/>  
      
    <xsl:variable name="mon" select="'Aug'"/>  
    <xsl:value-of select="substring($m_werte,string-length(substring-before($m_namen,$mon))+1,2)"/>  
    <!-- 08 -->
    

    Grüße,
    Thomas