Jeena Paradies: CDATA als Baum behandeln | Variablennamen zusammensetzen

Hallo,

Ich habe zwei Fragen:

1. Ich möchte einen RSS-Feed in HTML umwandeln, dabei sieht das ungefähr so aus:
<description><![CDATA[<p>Foo Bar baz.</p><img src="http://example.com/foo.gif" alt="" />]]></description>

Ich habe es immerhin schon geschafft mit Hilfe von <xsl:value-of select="description" disable-output-escaping="yes" /> dass der HTML-Code in der Ausgabe nicht maskiert wird. Allerdings bräuchte ich das <img> eigentlich an einer komplett anderen Stelle. Deshalb die Frage wie ich es hinbekomme das <img> da rauszukriegen, zwischenzuspeichern und an einer anderen Stelle einzufügen.

2. Ich habe ein Datum: <pubDate>Tue, 03 Jul 2007 08:08:43 GMT</pubDate> und muss nun aus dem kurzen Monatsnamen (Jul) die entsprechende Zahl machen (07). Mit Hilfe von <xsl:value-of select="substring(pubDate, 9, 3)" /> kann ich schon mal den Monatsnamen isoliert ausgeben, aber wie mache ich den zur entsprechenden Zahl?

Ich habe mir überlegt dass ich für jeden Monat eine Variable anlege um sie dann auszugeben:

<xsl:variable name="Jan">01</xsl:variable>  
<xsl:variable name="Feb">02</xsl:variable>  
...  
<xsl:value-of select="$Jan" />

Aber ich weiß nicht wie ich da jetzt den Variablennamen variabel da reinbekomme. Oder habt ihr vielleicht eine sinnvolle Alternative dazu?

Jeena

  1. Hallo,

    <xsl:variable name="Jan">01</xsl:variable>

    <xsl:variable name="Feb">02</xsl:variable>
    ...
    <xsl:value-of select="$Jan" />

      
    Ich habe das jetzt hinbekommen:  
      
    ~~~xml
    <?xml version="1.0" encoding="ISO-8859-1" ?>  
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:arr="http://example.com/XSL/jeena/arr">  
     <arr:months>  
      <arr:month n="01">Jan</arr:month>  
      <arr:month n="02">Feb</arr:month>  
      <arr:month n="03">Mar</arr:month>  
      <arr:month n="04">Apr</arr:month>  
      <arr:month n="05">May</arr:month>  
      <arr:month n="06">Jun</arr:month>  
      <arr:month n="07">Jul</arr:month>  
      <arr:month n="08">Aug</arr:month>  
      <arr:month n="09">Sep</arr:month>  
      <arr:month n="10">Oct</arr:month>  
      <arr:month n="11">Nov</arr:month>  
      <arr:month n="12">Dec</arr:month>  
     </arr:months>  
     <xsl:key name="month" match="arr:month" use="."/>  
     <xsl:template match="/">  
       <xsl:for-each select="/rss/channel/item">  
        <xsl:variable name="month"><xsl:value-of select="substring(pubDate, 9, 3)" /></xsl:variable>  
        <xsl:for-each select="document('')"><xsl:value-of select="key('month',$month)/@n"/></xsl:for-each>  
       </xsl:for-each>  
     </xsl:template>  
    </xsl:stylesheet>
    

    Das erste Problem besteht aber immer noch.

    Jeena

  2. Hallo Jeena,

    Allerdings bräuchte ich das <img> eigentlich an einer komplett anderen Stelle. Deshalb die Frage wie ich es hinbekomme das <img> da rauszukriegen, zwischenzuspeichern und an einer anderen Stelle einzufügen.

    Probiere es je nach Komplexität der sonstigen CDATA-Inhalte auf diese Weise:

    <xsl:variable name="img" select="concat('&lt;img',substring-before(substring-after(description,'img'),'/>'),'/>')"/>  
    ...  
    <xsl:value-of select="$img" disable-output-escaping="yes"/>
    

    Mit Hilfe von <xsl:value-of select="substring(pubDate, 9, 3)" /> kann ich schon mal den Monatsnamen isoliert ausgeben, aber wie mache ich den zur entsprechenden Zahl?

    Ich nutze in einer Transformation mit Datumswerten diese Notation:

    Globale Definitionen (nach xsl:stylesheet):

    <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 '"/>
    

    und dann in der Abfrage bezogen auf den Monatsnamen in $datum:
    substring($m_werte,string-length(substring-before($m_namen,substring($datum,9,3)))+1,2)

    Grüße,
    Thomas

    1. Hallo,

      <xsl:variable name="img" select="concat('&lt;img',substring-before(substring-after(description,'img'),'/>'),'/>')"/>

      <xsl:value-of select="$img" disable-output-escaping="yes"/>

      Funktioniert prima, nur muss ich mir das ganze mal auseinanderfriemeln damit ich mal kappiere was da passiert.  
        
      
      > Ich nutze in einer Transformation mit Datumswerten diese Notation:  
      
      Ah ok an so etwas habe ich gar nicht gedacht, aber das ist recht einfach zu verstehen.  
        
      Vielen Dank für deine Mühe. XSL scheint sehr interessant zu sein, wenn auch die 1.0er Version recht begrenzt in den Möglichkeiten zu sein scheint.  
        
         Jeena  
      ![](http://jeenaparadies.net/pavatar.png)
      
      -- 
      [Operas Speeddial](http://jeenaparadies.net/weblog/2007/jun/operas-speeddial)  | [Jlog](http://jeenaparadies.net/webdesign/jlog/) | [Gourmetica Mentiri](http://jeenaparadies.net/gourmetica-mentiri/)
      
      1. Hallo Jeena,

        XSL scheint sehr interessant zu sein, wenn auch die 1.0er Version recht begrenzt in den Möglichkeiten zu sein scheint.

        Machbar ist alles, aber der Aufand ist ist manchmal nicht unerheblich. XSLT 2.0 bzw. hier XPath 2.0 bieten mehr Techniken bzw. vorgefertigte Funktionen zur komfortableren Umsetzung von Algorithmen -- auf Dein Beispiel bezogen bietet sich die Nutzung von Sequenzen an:

        <xsl:variable name="monate" select="('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')"/>  
          
        <xsl:variable name="mnr" select="fn:index-of($monate,'Feb')"/><!-- Beispiel 'Feb'-Index-Zuordnung -->  
        <xsl:value-of select="if($mnr lt 10) then fn:concat('0',$mnr) else($mnr)"/><!-- 02 -->
        

        Grüße,
        Thomas