Tekknotrip: XML/rss File hat im Child HTML - wie lese ich das aus?

Hallo Leute,

kein Tag ohne ein Problem :-D Besonders bei XSL...

Also...habe folgenden Code in XML

________________________________________
content:encoded
<h4><a href="http://www.rssweather.com/hw3.php?icao=EDDS"><img src="http://www.rssweather.com/images/fcicons/mcloudy.gif" alt="mostly cloudy" class="icon" width="55" height="58" id="mcloudy.gif" border="0"/></a><span class="sky">Mostly cloudy</span> <span class="temp">18&#176;C</span></h4><dl style="display: inline;">
<dt style="display: inline; font-weight: bold;">Humidity:</dt><dd id="humidity" style="display: inline;">55%</dd>
<dt style="display: inline; font-weight: bold;">Wind Speed:</dt><dd id="windspeed" style="display: inline;">27 KMH</dd>
<dt style="display: inline; font-weight: bold;">Wind Direction:</dt><dd id="winddir" style="display: inline;">SW (230&#176;)</dd>
<dt style="display: inline; font-weight: bold;">Barometer:</dt><dd id="pressure" style="display: inline;"> 1014 mb</dd>
<dt style="display: inline; font-weight: bold;">Dewpoint:</dt><dd id="dewpoint" style="display: inline;">9&#176;C</dd>
<dt style="display: inline; font-weight: bold;">Heat Index:</dt><dd id="heatindex" style="display: inline;">18&#176;C</dd>
<dt style="display: inline; font-weight: bold;">Wind Chill:</dt><dd id="windchill" style="display: inline;">17&#176;C</dd>
<dt style="display: inline; font-weight: bold;">Visibility:</dt><dd id="visibility" style="display: inline;">11 km</dd></dl>
</content:encoded>
__________________________________________

Wie komme ich da nun z.B. an den Wert von "Humidity" ran?

Das klappt irgendwie nicht:
<xsl:value-of select="content:encoded/dl/dd[@id='humidity']"/>

an Content:encoded komme ich ran, kann aber nicht mehr tiefer gehen

Über Antworten würde ich mich freuen,
Gruss, Micha

  1. Hallo,

    Wie komme ich da nun z.B. an den Wert von "Humidity" ran?
    Das klappt irgendwie nicht:
    <xsl:value-of select="content:encoded/dl/dd[@id='humidity']"/>

    Das ist an sich richtig, aber es hängt davon ab _wo_ du diese value-of aufrufst.

    Das select="content:encoded/dl/dd[@id='humidity']" ist ein relativer Pfad, d.h. es wird vom Kontextknoten ausgehend selektiert.

    Beispiele:
    wenn du in einem Template <xsl:template match="content:encoded"> bist sucht dein value-of so:
    {da bist du jetzt: [content:encoded] /}content:encoded/dl/dd[@id='humidity'] in Elementen ausgedrückt: {da bis du jetzt:content:encoded/}content:encoded/<dl>/<dd> und dieser Pfad gibt es nicht.

    Die anderen Möglichkeit du hast ein <![CDATA[ ]]> in deinem content:encoded stehen (so wie es im original XML der Fall ist).

    Für eine ausführlichere Hilfe muss du mehr von deinem XSL preisgeben.

    Grüße
    Thomas

    1. Guten Morgen,
      der Kollege Thomas Meinike hat mir schon eine Lösung präsentiert...die erste Wahrscheinlichkeit trifft niocht zu, war schon im richtigen Pfad, also ich konnte selbst das content:encoded noch auslesen....aber nicht mehr weiter

      danke!
      gruss, Micha

  2. Hallo,

    Wie komme ich da nun z.B. an den Wert von "Humidity" ran?

    Das klappt irgendwie nicht:
    <xsl:value-of select="content:encoded/dl/dd[@id='humidity']"/>

    an Content:encoded komme ich ran, kann aber nicht mehr tiefer gehen

    Der Inhalt von content:encoded ist ein CDATA-Abschnitt, der fuer XPath nicht direkt zugaenglich ist. Man kann nur den gesamten Textknoten abfragen und muss dann Zeichenkettenfunktionen anwenden. Vom Ansatz her funktioniert es so:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:content="http://purl.org/rss/1.0/modules/content/"
      exclude-result-prefixes="content">

    <xsl:output
        method="html"
        doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
        doctype-system="http://www.w3.org/TR/html401/loose.dtd"
        encoding="ISO-8859-1"
        version="4.01"/>

    <xsl:template match="/">
        <html>
          <head>
            <title>RSS-Weather-Test</title>
          </head>
          <body>
            xsl:apply-templates/
          </body>
        </html>
      </xsl:template>

    <xsl:template match="/rss/channel">
        <xsl:apply-templates select="item//content:encoded"/>
      </xsl:template>

    <xsl:template match="content:encoded">
        <xsl:variable name="temp" select="substring-after(text(),'id=&quot;humidity&quot; style=&quot;display: inline;&quot;&gt;')"/>
        <xsl:variable name="humidity" select="substring-before($temp,'&lt;/dd&gt;')"/>
        <p>Humidity: <xsl:value-of select="$humidity"/></p>
      </xsl:template>

    </xsl:stylesheet>

    Ergebnis:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>RSS-Weather-Test</title>
    </head>
    <body><p>Humidity: 55%</p></body>
    </html>

    MfG, Thomas

    1. Hey....danke :-)))

      der fuer XPath nicht direkt zugaenglich ist.

      Das muss man wissen!