Filtern mit xsl

chris_head

Mitglied
Hallo zusammen,

ich versuche aus folgendem xml eine bestimmte Variation herauszufiltern (mit bestimmten Bedingungen).
HTML:
<Fahrzeug>
	<Bauteil>
		<Name>Rad</Name>		
		<Variation Typ="alle">
			<RadTyp>RadAlle</RadTyp>
		</Variation>	
                <Variation Typ="ABC">
			<RadTyp>RadABC1</RadTyp>
		</Variation>
                <Variation Typ="ABC">
			<RadTyp>RadABC2</RadTyp>
		</Variation>
		<Variation Typ="XYZ">
			<RadTyp>RadXYZ123</RadTyp>
		</Variation>			
	</Bauteil>
        <Bauteil>
		<Name>Frontscheinwerfer</Name>		
		 <Variation Typ="alle">
			<LichtTyp>UniLicht</LichtTyp>
		</Variation>
		<Variation Typ="XYZ">
			<LichtTyp>LichtXYZ456</LichtTyp>
		</Variation>			
	</Bauteil>	...
</Fahrzeug>

Die Filterregeln sind folgende: Ich suche generell nach dem Bauteil für einen bestimmten Typ z.B. ABC . Die erste Variation, die dem gesuchten Typ unterstützt, wird ausgewählt. Sollte es keine Bauteil für den speziellen Typ geben (für Typ ABC bei Licht) soll die Variation "alle" gewählt werden. Es gibt IMMER mindestens eine Variation für "alle".
Meine Überlegung war jeweils immer alle Variationen zu einem Bauteil nach dem speziellen Typ zu durchfahren und dann die Ergebnismenge zu überprüfen. Wenn diese leer ist nochmals die Variationen zu durchlaufen und nach "alle" suchen. Leider weiß ich nicht wie man dies in xslt umsetzt ( mangels richtiges Denken in xml und/oder Wissen für xml/xslt). Daher wäre ein kleiner oder auch größerer Denkanstoß nicht schlecht.

Gruß Chris
 
Hi.

XML:
<xsl:variable name="variation" select="Variation[@Typ = 'ABC']" />
<xsl:choose>
  <xsl:when test="$variation">
    <xsl:value-of select="$variation" />
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="Variation[@Typ = 'alle']" />
  </xsl:otherwise>
</xsl:choose>
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

ich habe auch etwas gemacht, ist wahrscheinlich nicht sehr gut da ich selbst noch Anfänger in XML aber wollte es trotzdem probieren!
Ich poste dir hintereinander mal die Codes die ich verwendet und das Ergebnis der Transformation!

XML Code:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="C:\Documents and Settings\Chris\Desktop\bauteil.xsl"?>
<Fahrzeug>
	<Bauteil>
		<Name>Rad</Name>
		<Variation Typ="alle">
			<RadTyp>RadAlle</RadTyp>
		</Variation>
		<Variation Typ="ABC">
			<RadTyp>RadABC1</RadTyp>
		</Variation>
		<Variation Typ="ABC">
			<RadTyp>RadABC2</RadTyp>
		</Variation>
		<Variation Typ="XYZ">
			<RadTyp>RadXYZ123</RadTyp>
		</Variation>
	</Bauteil>
	<Bauteil>
		<Name>Frontscheinwerfer</Name>
		<Variation Typ="alle">
			<LichtTyp>UniLicht</LichtTyp>
		</Variation>
		<Variation Typ="XYZ">
			<LichtTyp>LichtXYZ456</LichtTyp>
		</Variation>
	</Bauteil>
</Fahrzeug>

Der XSL Code:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
	<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" doctype-system="http://www.w3.org/TR/html4/strict.dtd" doctype-public="-//W3C//DTD HTML 4.01//EN"/>
	<xsl:template match="Fahrzeug">
		<html>
			<head>
				<title>
				</title>
			</head>
			<body>
				<xsl:apply-templates/>
			</body>
		</html>
	</xsl:template>

	<xsl:template match="Fahrzeug">
		<xsl:for-each select="Bauteil">
			<xsl:value-of select="Name"/><xsl:text>: </xsl:text><br/>
			<xsl:choose>
				<xsl:when test="Variation/@Typ = 'ABC'">
					<xsl:for-each select="Variation[@Typ='ABC']">
						<xsl:value-of select="*"/><br />
					</xsl:for-each>
				</xsl:when>
				<xsl:otherwise><xsl:value-of select="Variation[@Typ='alle']/*"/></xsl:otherwise>
			</xsl:choose>
		</xsl:for-each>
	</xsl:template>
</xsl:stylesheet>

Die Ausgabe der Transformation ist HTML Code und zeigt so etwas:

Code:
Rad: 
RadABC1
RadABC2
Frontscheinwerfer: 
UniLicht


Gruß
 
Hallo zer0,

die for-each-Elemente sind nicht notwendig und wenn du eine HTML-Ausgabe machen möchtest, dann würde ich das aus semantischen Gründen in eine Liste einschließen.
Außerdem sollte eigentlich bei der Filterung nur die erste Variation ausgegeben werden. Ich würde es deshalb so machen:
Code:
   <xsl:template match="/">
      <html>
         <head>
            <title>Titel</title>
         </head>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>

    <xsl:template match="Fahrzeug">
        <dl>
            <xsl:apply-templates/>
        </dl>
    </xsl:template>

    <xsl:template match="Bauteil">
        <dt>
            <xsl:value-of select="Name"/>
            <xsl:text>: </xsl:text>
        </dt>
        <dd>
            <xsl:choose>
                <xsl:when test="Variation[@Typ='ABC']">
                    <xsl:value-of select="Variation[@Typ='ABC'][1]"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="Variation[@Typ='alle']"/>
                </xsl:otherwise>
            </xsl:choose>
        </dd>
    </xsl:template>
 

Neue Beiträge

Zurück