Announcement

Collapse
No announcement yet.

Problem bei Umformung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem bei Umformung

    Hallo alle miteinander. Ich hänge gerade an einer XSLT Übungsaufgabe fest:
    Folgendes XML:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet href="exam2_1.xsl" type="text/xsl" ?>
    <ankunftszeiten>
      <zug>
        <nummer>EC 267</nummer>
        <typ>EC</typ>
        <NächsterHalt>
          <bahnhof>Bruchsal</bahnhof>
          <ankunft art="planmaessig">18:17</ankunft>
          <ankunft art="voraussichtlich">18:26</ankunft>
        </NächsterHalt>
      </zug>
      <zug>
        <nummer>ICE 872</nummer>
        <typ>ICE</typ>
        <NächsterHalt>
          <bahnhof>Frankfurt(Main)Hbf</bahnhof>
          <ankunft art="planmaessig">18:17</ankunft>
          <ankunft art="voraussichtlich">18:18</ankunft>
        </NächsterHalt>
      </zug>
    </ankunftszeiten>
    Soll in folgendes XML umgewandelt werden:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <ankunftszeiten>
      <zug>
        <nummer>EC 267</nummer>
        <typ>EC</typ>
        <NächsterHalt>
          <bahnhof>Bruchsal</bahnhof>
          <ankunft art="planmaessig">18:17</ankunft>
          <ankunft art="voraussichtlich">18:26</ankunft>
        </NächsterHalt>
      </zug>
    </ankunftszeiten>
    Ziel ist dass nur noch die Züge angegeben werden, die mindestens 5 Minuten Verspätung haben, also wo 'voraussichtlich' - 'planmaessig' >= 5 Minuten ist.
    Die Umformung soll nur durch XSLT erfolgen. Mein bisheriger Lösungsansatz funktioniert nicht, wahrscheinlich habe ich die Grundsätze von XSLT garnicht richtig verstanden.

    Meine (falsche) Lösung:
    Code:
    <?xml version="1.0"?>
    
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:template match="ankunftszeiten">
      <xsl:copy>
        <xsl:apply-templates select="zug/NächsterHalt/ankunft"/>
        <xsl:apply-templates select="zug"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="ankunft">
      <xsl:if test="contains(@art, 'planmaessig')">
        <xsl:variable name="plan_hour" select="substring-before(., ':')"/>
    	<xsl:variable name="plan_minutes" select="substring-after(., ':')"/>
        <xsl:variable name="plan" select="$plan_hour * 60 + $plan_minutes"/>
      </xsl:if>
      <xsl:if test="contains(@art, 'voraussichtlich')">
        <xsl:variable name="vorr_hour" select="substring-before(., ':')"/>
    	<xsl:variable name="vorr_minutes" select="substring-after(., ':')"/>
        <xsl:variable name="vorr" select="$vorr_hour * 60 + $vorr_minutes"/>
      </xsl:if>
    </xsl:template>
    
    <xsl:template match="zug">
      <xsl:if test="($vorr - $plan) &gt; 5">
        <xsl:copy-of select="."/>
      </xsl:if>
    </xsl:template>
    
    </xsl:stylesheet>
    Ich dachte dass meine Anweisung
    Code:
    <xsl:apply-templates select="zug/NächsterHalt/ankunft"/>
    zuerst ausgeführt wird und dadurch die Variablen erstellt werden, und danach im zweiten Template die Ausgabe erfolgt. Dem ist aber nicht so, ich erhalte den Fehler "Variable oder Parameter 'vorr' ist nicht definiert".

    Vorschläge ?

  • #2
    Hier ein etwas verknappter Vorschlag, der zum erwarteten Ergebnis führt:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    
    <xsl:template match="ankunftszeiten">
      <ankunftszeiten>
        <xsl:apply-templates select="zug"/>
      </ankunftszeiten>
    </xsl:template>
    
    <xsl:template match="zug">
    
      <xsl:variable name="plan_hour" select="substring-before(NächsterHalt/ankunft[1], ':')"/>
      <xsl:variable name="plan_minutes" select="substring-after(NächsterHalt/ankunft[1], ':')"/>
      <xsl:variable name="plan" select="$plan_hour * 60 + $plan_minutes"/>
    
      <xsl:variable name="vorr_hour" select="substring-before(NächsterHalt/ankunft[2], ':')"/>
      <xsl:variable name="vorr_minutes" select="substring-after(NächsterHalt/ankunft[2], ':')"/>
      <xsl:variable name="vorr" select="$vorr_hour * 60 + $vorr_minutes"/>
    
      <xsl:if test="($vorr - $plan) &gt;= 5">
        <xsl:copy-of select="."/>
      </xsl:if>
    
    </xsl:template>
    
    </xsl:stylesheet>

    Comment


    • #3
      Vielen Dank. Von diesem Array-artigen Zugriff wusste ich nichts.

      Comment

      Working...
      X