PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : xsl schleifen



shb
28-02-2010, 18:34
so konnte ja hier schon das ein oder andere problem löse nun ist es so, das ich mein xml file in dem vormat habe, wie ich es mir vorstelle.


<?xml version="1.0" encoding="UTF-8"?>
<kalender>
<jahr>
<monat>
<person>
<name>Wolf</name>
<dg>noch leer </dg>
<termin datum="2010-02-02">
</termin>
<termin datum="2010-02-04">
</termin>
<termin datum="2010-02-07">
</termin>
<termin datum="2010-02-09">
</termin>
</person>
<person>
<name>Mustermann</name>
<dg>noch leer </dg>
<termin datum="2010-02-09">
</termin>
</person>
</monat>
</jahr>
</kalender>

nun soll das ganz ja auch entsprechen aufbereitet werden, in meinem fall halt mit xsl, mit
<xsl:template match="termin">
kann ich das ganze ja auch anzeigen lassen, aber da es ja wie ein kalender werden soll will ich mir dann ja auch die freien tage anzeigen lassen, aber in der o.g. schleife werden ja nur alle hintereinander angezeigt. aber es kann ja auch nicht lösung sein, das ich jede spalte angebe und bei übereinstimmung erst befülle, ich würde das ganze gerne in einer schleife lösen.
ich hatte auch schon überlegt das xml file auch mit leeren einträgen zu befüllen, aber dann hab ich ja sinnlose datensätze die ich nicht benötige.
wie kann ich das problem lösen?

thx cu SHB

undefined
01-03-2010, 18:25
Du brauchst keine Schleife, verwende xsl:key auf das Attribute datum.

shb
02-03-2010, 17:34
nein, ich glaube ich habe mich falsch ausgedrückt.
ich möchte eine tabelle mit den werten aus dem xml file haben, die tabelle soll zwischen 28 und 31 spalten haben, je nachdem wie lang der monat ist. die daten sollen dann entsprechend in dem tag angezeigt werden. Aber wie kriege ich das mit xsl so eine dynamische schleife hin? mit php würde ich so in der richtung lösen

for($i=1;$i<=$monat_dauer;$i++){
echo "<td>Inhalt</td>";
}

aber das geht mit xsl wohl nicht so.

cu SHB

undefined
03-03-2010, 17:45
Garnicht, XSLT ist ein Prozeduraler Transformator.
Etwas klarer ausgedrückt: Ein Leistungsfähiger XML Umwandler.
Wenn du dem XSLT Prozessor also nicht passend fütterst wird das nichts geben. Es gibt zwar etliche Extension wie z.B: date und string aber das sind reine Konverter Erweiterungen.
Du hast aber die möglichkeit deinen Kalender im XML mit einzubauen oder du ziehst es bei PHP mit den EXSLT Object Model rein.
Ein simples Beispiel (nicht getestet) ;)


<?php

function thisMonth()
{
$dom = new DomDocument( '1.0', 'utf-8' );
$dom->formatOutput = true;
$month = $dom->createElement( "month" );
$dom->appendChild( $month );
$days = range( 1, date('t') );
foreach ( range( 0, 34 ) AS $d )
{
if ( $d % 7 == 0 )
$week = $dom->createElement( "week" );

$d = in_array( $d, $days ) ? $d : " ";
$week->appendChild( $dom->createElement( "day", $d ) );

if ( $d % 7 == 0 )
$month->appendChild( $week );
}
return $dom;
}

function Template()
{
global $connection;

$dom = new DomDocument( '1.0', 'utf-8' );
$dom->load( "index.xml" );

$stylesheet = new DomDocument( '1.0', 'utf-8' );
$stylesheet->load('index.xslt');

$xsl = new XSLTProcessor;
$xsl->registerPHPFunctions();
$xsl->importStyleSheet( $stylesheet );

return $xsl->transformToXML( $dom );
}

header( "Content-Type: text/html; charset=utf-8" );
echo Template();
?>

Achte bei dem Beispiel vor allem auf die Stylesheet Definition.


<?xml version = '1.0' encoding = 'utf-8' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
xmlns:php="http://php.net/xsl"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="date php exsl">

<xsl:output version="1.0"
method="xml"
encoding="utf-8"
indent="yes"
media-type="application/xhtml+xml"
doctype-system = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public = "-//W3C//DTD XHTML 1.0 Strict//EN"
/>

<xsl:key name="termine" match="termin" use="@datum" />

<xsl:template name="kalender">
<xsl:if test="exsl:object-type(php:function('thisMonth')) = 'node-set'">
<table summary="Cal" border="1">
<xsl:for-each select="exsl:node-set(php:function('thisMonth'))/month/week">
<tr>
<xsl:for-each select="./day">
<td>
<xsl:if test="date:day-of-week-in-month() = .">
<xsl:attribute name="style">
<xsl:text>color:red;</xsl:text>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="." />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:if>
</xsl:template>

<xsl:template match="/">
<head>
<title><xsl:text>Kalender</xsl:text></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="index.css" media="all" />
</head>
<body>
<div>
<p>Kalender</p>
<xsl:call-template name="kalender" />
</div>
</body>
</xsl:template>

</xsl:stylesheet>