Announcement

Collapse
No announcement yet.

xsl:if Wo liegt der Fehler?

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

  • xsl:if Wo liegt der Fehler?

    Je mehr Antworten ich hier bekomme, desto mehr Zeit investiere ich, um doch mehr und mehr -zumindest zu verstehen.

    Ich möchte zwei Termine miteinander vergleichen, um daraus zu entscheiden, ob ein abweichender Termin angezeigt werden soll, oder nicht.

    Meine Idee sieht aus, wie folgt:
    HTML Code:
    
    		<xsl:if test="format-dateTime(../givenPlannedEndDateMax, $dateFormatter) &gt; format-dateTime(../givenPlannedStartDateMin, $dateFormatter)">
    			<value-of select="format-dateTime(../givenPlannedEndDateMax, $dateFormatter)"/>
    		</xsl:if>

    Aus diese Weise erhalte ich keine Ausgabe. Ich kann aber nicht erkennen, wo mein Fehler liegt? Bin für Unterstützung dankbar.

  • #2
    Nur zur Sicherheit: format-dateTime() ist eine XPath 2.0-Funktion, funktioniert also u. a. in Browsern nicht. Ansonsten würde ich Datums-/Zeit-Werte auch nicht über eine format-Funktion vergleichen, sondern mittels xs:date()-Konstruktor aufbereiten und direkt vergleichen:
    Code:
    <xsl:variable name="datum_heute" select="fn:current-date()" as="xs:date"/><!-- 2008-08-06 --> 
    <xsl:variable name="datum_ziel" select="xs:date('2008-12-24')" as="xs:date"/> 
    <xsl:value-of select="if($datum_ziel eq $datum_heute) then 'Zieldatum erreicht' else if($datum_ziel lt $datum_heute) then 'Zieldatum überschritten' else if($datum_ziel gt $datum_heute) then 'Zieldatum noch nicht erreicht' else()"/>
    Zeige ansonsten mal die relevanten XML-Daten zum Testen.
    Zuletzt editiert von Thomas Meinike; 06.08.2008, 15:01.

    Comment


    • #3
      Ich stelle mal kurz die -in meinen Augen- relevanten xml-teil ein:

      HTML Code:
              <Activity id="692" flatOrder="2649">
                  <title>03 Grundsteinlegung</title>
                  <description>Die Aufträge für Roh- und Stahlbau, sowie Dach und Hülle sind vergeben. Erste Betonarbeiten sind erfolgt.</description>
                  <givenFlagStatus>automatic</givenFlagStatus>
                  <flagStatus>green</flagStatus>
                  <wbsCode>06.03</wbsCode>
                  <isMilestone/>
                  <priority>2</priority>
                  <optimizesPlannedDuration/>
                  <givenPlannedStartMode>asap</givenPlannedStartMode>
                  <givenPlannedStartDateMin>2007-11-28T08:00:00</givenPlannedStartDateMin>
                  <givenPlannedStartDateMax>2008-02-14T08:00:00</givenPlannedStartDateMax>
                  <fixStartDateWindow/>
                  <givenPlannedEndDateMin>2007-11-28T08:00:00</givenPlannedEndDateMin>
                  <givenPlannedEndDateMax>2008-02-14T08:00:00</givenPlannedEndDateMax>
      Ziel ist es eine Meilensteinauflistung -zumindest per Tabelle- zu erstellen. Welcher Termin war geplant (givenPlannedStartDateMin), zu welchem Termin wurde der Meilenstein erreicht/ bei Verschiebungen soll erreicht werden (givenPlannedEndDateMax)? Direkt vergleichen ist sicherlich eine für den Einzelfall gute Lösung, würde das gerne über eine Abfrage schaffen, sozusagen als Vorlage?

      Ziel wäre es am Ende auch eine grafische Darstellung zu erhalten, aber da habe ich noch überhaupt keinen blassen Schimmer, wie man das anstellt, ist somit nicht Zielstellung dieses Threads.

      Comment


      • #4
        Ansatz (gt ist ein neuer XPath-Operator für den Vergleich atomarer Werte, &gt; funktioniert weiterhin):
        Code:
        <xsl:template match="Activity">
          <xsl:if test="xs:dateTime(givenPlannedEndDateMax) gt xs:dateTime(givenPlannedStartDateMin)">
            <xsl:value-of select="givenPlannedEndDateMax"/>
          </xsl:if>  
        </xsl:template>
        Die Formatierung der Ausgabe lässt sich entsprechend anpassen.

        Comment


        • #5
          gut, dann bin ich ja soweit nicht entfernt. Doch weiss ich nicht, auf welcher Hierarchieebene das xsl:template abgelegt werden muss.

          Anbei das gesamt Formular mit all seinen Fehlern. Ich habe viele Positionen für das xsl:template getestet, aber nicht die richtige. Sie haben hier sicherlich den Masterblick?!

          Unklarheiten liegen ab Zeile 128:

          HTML Code:
          <?xml version="1.0"?>
          <xsl:stylesheet version="2.0" 
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              xmlns:xs="http://www.w3.org/2001/XMLSchema">
          	
          <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>
          
          <xsl:param name="duration" select="P14D"/>
          <xsl:param name="showResource"/>
          <xsl:param name="dateFormatter" select="'[D01].[M01].[Y]'"/>
          
          <xsl:template name="formatDuration">
           	<xsl:param name="duration"/>
          
          	<xsl:value-of select="$duration/@amount" />
          	<xsl:text> </xsl:text>
          	<xsl:if test="$duration/@amount=1">
          		<xsl:choose>
          			<xsl:when test="$duration/@unit = 'minutes'">Minute</xsl:when>
          			<xsl:when test="$duration/@unit = 'hours'">Stunde</xsl:when>
          			<xsl:when test="$duration/@unit = 'days'">Tag</xsl:when>
          			<xsl:when test="$duration/@unit = 'weeks'">Woche</xsl:when>
          			<xsl:when test="$duration/@unit = 'months'">Monat</xsl:when>
          			<xsl:when test="$duration/@unit = 'quarters'">Quartal</xsl:when>
          			<xsl:when test="$duration/@unit = 'years'">Jahr</xsl:when>
          		</xsl:choose>
          	</xsl:if>
          	<xsl:if test="$duration/@amount!=1">
          		<xsl:choose>
          			<xsl:when test="$duration/@unit = 'minutes'">Minuten</xsl:when>
          			<xsl:when test="$duration/@unit = 'hours'">Stunden</xsl:when>
          			<xsl:when test="$duration/@unit = 'days'">Tage</xsl:when>
          			<xsl:when test="$duration/@unit = 'weeks'">Wochen</xsl:when>
          			<xsl:when test="$duration/@unit = 'months'">Monate</xsl:when>
          			<xsl:when test="$duration/@unit = 'quarters'">Quartale</xsl:when>
          			<xsl:when test="$duration/@unit = 'years'">Jahre</xsl:when>
          		</xsl:choose>
          	</xsl:if>
          </xsl:template>
          
          <xsl:template match="Project">
          	<html>
          	<head>
          	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
          	<link rel="stylesheet" type="text/css" href="rsc/styles.css" />
          	</head>
          	<body>
          	
          	<!-- Standard Report Header: START -->
          
          	<div id="logo">
          	<img src="rsc/Logo_02.pdf" />
          	</div>
          
          	<div id="header">
          		<h2><xsl:value-of select="title"/></h2>
          		<xsl:variable name="now" select="current-date()"/>
          		<h2>Stand vom: <xsl:value-of select="format-date($now, $dateFormatter)"/></h2><br /><br />
          		<h2>Auflistung aller Meilensteine</h2>
          	</div>
          	
          	<div id="projectstamp">
                <table class="report">
          	  <tr>
          		<th colspan="2">Projektstempel</th></tr>
          		<tr class="r1">
          			<td class="title">Projektname</td>
          			<td class="projectname"><xsl:value-of select="title"/></td>
          		</tr>
          		<tr class="r0">
          			<td class="title">Geplant: Start-Ende</td>
          			<td>
          				<xsl:value-of select="format-dateTime(plannedStartDate, $dateFormatter)"/> - 
          				<xsl:value-of select="format-dateTime(plannedEndDate, $dateFormatter)"/> 
          				</td>
          		</tr>
          		<tr class="r1">
          			<td class="title">Erwartet: Start-Ende</td>
          			<td>
          				<xsl:value-of select="format-dateTime(expectedStartDate, $dateFormatter)"/> - 
          				<xsl:value-of select="format-dateTime(expectedEndDate, $dateFormatter)"/>
          				</td>
          		</tr>
          		<xsl:if test="description != ''">
          			<tr class="r0">
          				<td class="title">Ziel</td>
          				<td><xsl:value-of select="description"/></td>
          			</tr>
          		</xsl:if>	
          	</table>
          	</div>
          	<!-- Standard Report Header: END -->
          	
          	<!-- A L L E  M E I L E N S T E I N E -->
          	
          	<div id="break" />
          	
          	<xsl:variable name="now" select="xs:dateTime(current-date())"/>
          	<xsl:variable name="maxDate" select="$now + xs:dayTimeDuration($duration)"/>
          
          
              <div id="nextduedates">
          
          	<table class="report">
          	<tr>
          	<th>Status</th>
          	<th>Name</th>
          	<th>Termin</th>
          	<th>Terminverzug</th>
          	<th>Definition</th>
          	</tr>
          		<xsl:for-each select="//isMilestone">
          		<xsl:sort select="flatOrder"/>
          		<tr class="r{position() mod 2}">
          		<td valign="top" align="center" width="5%">
          				<xsl:if test="../flagStatus = 'red'">
          					<img src="rsc/flag_red.gif" />
          				</xsl:if>
          				<xsl:if test="../flagStatus = 'yellow'">
          					<img src="rsc/flag_yellow.gif" />
          				</xsl:if>
          				<xsl:if test="../flagStatus = 'green'">
          					<img src="rsc/flag_green.gif" />
          				</xsl:if>
          			</td>
          		<td valign="top" align="left" width="20%"><xsl:value-of select="../title"/></td>
          		<td valign="top" align="center" width="10%"><xsl:value-of select="format-dateTime(../givenPlannedStartDateMin, $dateFormatter)"/></td>
          		<xsl:template match="Activity">
          		<td valign="top" align="center" width="10%">
          		<xsl:if test="xs:dateTime(../givenPlannedEndDateMax) gt xs:dateTime(../givenPlannedStartDateMin)">
          			<value-of select="format-dateTime(../givenPlannedEndDateMax, $dateFormatter)"/>
          		</xsl:if>
          		</td>
          		</xsl:template>		
          		<td valign="top" align="left" width="55%"><xsl:value-of select="../description"/></td>
          
          		</tr>
          		</xsl:for-each>
          
          	</table>
          	</div>
          		
          	<div id="copyright">
          	<img src="rsc/Logo.pdf" />
          	</div>
          
            </body>
            </html>
           
          </xsl:template>
          </xsl:stylesheet>

          Comment


          • #6
            Das Template war nur ein Beispiel bezogen auf die geposteten Informationen. Die Daten müssen natürlich an den "passenden" Stellen abgefragt werden. Einen "Masterblick" über jegliche fremden Strukturen habe ich auch nicht. Woher soll ich auch den Rest des Dokuments hernehmen?

            Comment


            • #7
              Sie haben ja Recht. Das kann und möchte ich nicht von Ihnen erwarten. Mich hatte das xsl:template nur irritiert, wie mich so vieles irritiert.

              Der kleine Fehler lag einfach darin, dass ich das kleine xsl vor dem :value-of select vergessen hatte und es in Ihrem Vorschlag schlicht überlesen hatte.

              HTML Code:
              		<td valign="top" align="center" width="10%">
              		<xsl:if test="xs:dateTime(../givenPlannedEndDateMax) gt xs:dateTime(../givenPlannedStartDateMin)">
              			<xsl:value-of select="format-dateTime(../givenPlannedEndDateMax, $dateFormatter)"/>
              		</xsl:if>
              		</td>
              Danke dennoch für die Unterstützung.

              Comment

              Working...
              X