Announcement

Collapse
No announcement yet.

Kinder vorhanden?

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

  • Kinder vorhanden?

    Hallo zusammen!

    Die Frage wird sich mit Sicherheit wieder als sehr simpel herausstellen, aber ich komme an einem Punkt nicht weiter.

    In einer Elementenfolge kann es Elemente geben, die bloß einen Wert als Inhalt haben:
    Code:
    <auto>bmw</auto>
    oder aber Elemente, die noch weitere Elemente als Kinder haben:
    Code:
    
    <auto>
    		<marke>audi</marke>
    </auto>
    Was ich möchte ist eben zum einen diese zwei Arten von Elementen unterscheiden und zum anderen die Werte jeweils auslesen zu können.

    So sieht mein template aus, das bei der Liste aufgerufen wird:

    Code:
    
    <xsl:for-each select="./*"> <!-- Das ist im Haupttemplate -->
    	<xsl:call-template name="createElement"/>
    </xsl:for-each>
    
    <xsl:template name="createElement">
    	<xsl:element name="{name(.)}">
    	<xsl:variable name="directvalue" select="."/>
    		<xsl:choose>
    			<xsl:when test="contains(./*, 'marke')"> <!-- wobei diese Abfrage definitiv falsch ist -->
    				<xsl:copy-of select="'gefunden'"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:value-of select="$directvalue"/>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:element>
    </xsl:template>
    Es scheint das Gleiche zu sein, ob in einem Element ein Wert (z.B. eine Zahl) oder weitere Elemente vorhanden sind, es wird beides als "Inhalt" angesehen.


    Bin für jeden Ratschlag sehr dankbar!

    Gruß
    Alex

  • #2
    Verwende die Bedingung <xsl:if test="marke">...</xsl:if> bzw. schreibe gleich die passenden Templates, also xsl:template match="auto" bzw. xsl:template match="auto[marke]".

    Comment


    • #3
      Danke Thomas! Das klappt so.

      Allerdings ist die Abfrage ob es sich bei einem Element um einen Knoten mit Kindern oder ohne handelt trotzdem wichtig. Etwas in der Art:
      Code:
      <xsl:if test="value=''">...</xsl:if>
      Ich weiß es leider nicht...

      Comment


      • #4


        <root>
        <auto>bmw</auto>
        <auto>
        <mark>audi</mark>
        </auto>
        </root>
        Code:
        
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        	<xsl:output indent="yes" method="xml"/>
        	<xsl:template match="/">
        		<root>
        			<xsl:apply-templates select="/root/auto"/>
        		</root>
        	</xsl:template>
        	<xsl:template match="auto">
        		<xsl:choose>
        			<xsl:when test="count(./child::*)=1">
        				<erg>
        					<xsl:text>hat kindknoten</xsl:text>
        				</erg>
        			</xsl:when>
        			<xsl:when test="count(./child::*)=0">
        				<erg>
        					<xsl:text>hat keine kindknoten</xsl:text>
        				</erg>
        			</xsl:when>
        			<xsl:otherwise>
        				<xsl:text>keine Aussage möglich</xsl:text>
        			</xsl:otherwise>
        		</xsl:choose>
        	</xsl:template>
        </xsl:stylesheet>
        Ergebnis
        Code:
        ´<?xml version="1.0" encoding="utf-8"?>
        <root>
           <erg>hat keine kindknoten</erg>
           <erg>hat kindknoten</erg>
        </root>

        Comment


        • #5
          Originally posted by xml-looser View Post
          Code:
          			<xsl:when test="count(./child::*)=0">
          Hallo xml-looser (der Nick passt eigentlich nicht...)
          die zitierte Zeile war das ausschlaggebende Kriterium für meine Suche. Vielen Dank!

          Leider kann ich den Befehl apply-templates nicht verwenden, da die Elementennamen sich nicht wiederholen, aber eine for-each Schleife tut es auch.

          Danke noch einmal an alle!

          Gruß
          Alex

          Comment

          Working...
          X