Substring in XSL
Stil
- xsl
0 ritschmanhard0 Stil
0 ThomasM
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
Hi Stil!
Ich sehe 2 Dinge:
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.
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
ahhh
besten Dank! beiden Antwortern! Das war nicht nur sehr hilfreich sondern auch noch erleuchtend.
thx
Stil
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