XSLT Liste durchsuchen

dsNDesign

Erfahrenes Mitglied
Hei,

ich habe folgende XML-Struktur:
Code:
<EVENT>
    <NAME>Veranstaltung</NAME>
    <GUEST>
        <NAME>Hans</NAME>
        <NAME>Peter</NAME>
        <NAME>Harald</NAME>
        <NAME>Hubert</NAME>
    </GUEST>
</EVENT>

Nun möchte ich mit XSLT den Name des Events (also "Veranstaltung") ausgeben, aber nur, wenn einer der Gäste ("GUEST") Harald heißt. Sollten zwei Gäste den gleichen Namen (in diesem Fall Harald) haben, soll der Name des Events trotzdem nur einmal ausgegeben werden.

Jemand eine Idee, wie ich das mache?

Gruß
 
Mit XSLT 2.0 und
Code:
<xsl:template match="/">
  <xsl:value-of select="//EVENT[GUEST/NAME = 'Harald']/NAME"/>
</xsl:template>
wird der Name aller Events ausgegeben, für die mindestens ein GUEST/NAME gleich Harald ist.

Mit XSLT 1.0 muss man etwas mehr Code schreiben:

Code:
<xsl:template match="/">
  <xsl:for-each select="//EVENT[GUEST/NAME = 'Harald']/NAME">
     <xsl:if test="position() > 1"><xsl:text> </xsl:text></xsl:if>
     <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:template>
 
Die xml Datei kann direkt im Browser angeschaut werden
Code:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="liste.xsl" ?>
<EVENT>
    <NAME>Veranstaltung</NAME>
    <GUEST>
        <NAME>Hans</NAME>
        <NAME>Peter</NAME>
        <NAME>Harald</NAME>
        <NAME>Hubert</NAME>
		<NAME>Harald</NAME>
    </GUEST>
</EVENT>

die stylesheet anweisung in datei liste.xsl schreiben

Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output indent="yes" method="html"/>
	<xsl:template match="/">
		<html>
			<xsl:apply-templates select="EVENT"/>
		</html>
	</xsl:template>
	<xsl:template match="EVENT">
		<table border="solid">
			<xsl:apply-templates select="NAME"/>
			<tbody>
				<xsl:apply-templates select="GUEST"/>
			</tbody>
		</table>
	</xsl:template>
	<xsl:template match="GUEST">
		<xsl:apply-templates select="NAME">
			<xsl:sort select="."/>
		</xsl:apply-templates>
	</xsl:template>
	<xsl:template match="NAME">
		<xsl:variable name="n" select="."/>
		<xsl:if test="not(preceding-sibling::*[.=$n])">
			<tr>
				<td>
					<xsl:value-of select="."/>
				</td>
			</tr>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>

oder mit xsl prozessor bearbeiten
http://www.oio.de/public/xml/xslt-prozessoren.htm

ergebniss:
Code:
<html>
  <table border="solid">
    <tr>
      <td>Veranstaltung</td>
    </tr>
    <tbody>
      <tr>
        <td>Hans</td>
      </tr>
      <tr>
        <td>Harald</td>
      </tr>
      <tr>
        <td>Hubert</td>
      </tr>
      <tr>
        <td>Peter</td>
      </tr>
    </tbody>
  </table>
</html>
eine html Datei die Browser angeschaut werden kann
 

Neue Beiträge

Zurück