Über Inhalte von Knoten iterieren XSLT

chaertl

Grünschnabel
Hallo Zusammen,

habe da eine kleine Frage, die ich recht kiffelig finde und zu der mir einfach keine Lösung einfallen will:

Ich habe folgendes xml-Dokument:

...
<titel>Mustertitel</titel>
<autoren>Hans Dampf, George W. Bush, Max Mustermann, Hans im Glück, Donald Duck</autoren>
...

Daraus möchte ich durch eine Transformation folgendes bekommen:
<autoren>
<autor>
<vorname>Hans</vorname>
<nachname>Dampf</nachname>
</autor>
<autor>
<vorname>George</vorname>
<vorname>W</vorname>
<nachname>Bush</nachname>
</autor>
usw.

Ich habe aber keine Ahnung wie ich das hinbekommen kann den String mit den ganzen Namen so zu zerstückeln, v.a. Position für Position um so an die einzelnen Teile zu kommen.

Wenn mir da jemand einen Tip hätte wäre ich sehr dankbar.

Gruß
Christian
 
N'Abend,

also ich versuchs mal, obwohl meine XSLT-Kentnisse schon etwas eingerostet sind. Probier mal folgendes:
Code:
<xsl:template match="titel/autoren">
<body>
  <xsl:call-template name="splitter">
    <xsl:with-param name="str" select="."/>
  </xsl:call-template>
  </body>
</xsl:template>

<xsl:template name="splitter">
  <xsl:param name="str"/>
  <xsl:choose>
    <xsl:when test="contains($str,',')">
      <autor>
      <xsl:call-template name="splitter2">
      	<xsl:with-param name="str2" select="substring-before($str,',')"/>
      </xsl:call-template>
       </autor>
      <xsl:call-template name="splitter">
        <xsl:with-param name="str" select="substring-after($str,',')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <autor>
      <xsl:call-template name="splitter2">
      	<xsl:with-param name="str2" select="$str"/>
      </xsl:call-template>
      </autor>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="splitter2">
	<xsl:param name="str2" />
	<xsl:choose>
		<xsl:when test="contains($str2,' ')">
			<vorname>
				<xsl:value-of select="substring-before($str2,' ')" />
			</vorname>
			<xsl:call-template name="splitter2">
        		<xsl:with-param name="str2" select="substring-after($str2,' ')"/>
      		</xsl:call-template>
		</xsl:when>
		<xsl:otherwise>
			<nachname>
				<xsl:value-of select="$str2" />
			</nachname>
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>
Das ganze ohne Anspruch auf Effektivität oder sonstiges, da ich nicht mehr so im Stoff stehe und deshalb nicht sagen kann, ob man solche Probleme so löst, oder es andere elegantere Möglichkeiten gibt ;-)

THMD
 
Hallo THMD,

ja, ich denke so oder so ähnlich könnte es klappen. Ich habe diese Aufgabenstellung in einer alten Klausur meines Profs gefunden. Da will er es mit zwei ineinander geschachtelten for-each Schleifen gelöst haben. Aber irgendwie habe ich den Eindruck das es eben nur über die Lösung geht, die du vorgeschlagen hast.

Danke dir für deinen Tip.

Gruß
Christian
 

Neue Beiträge

Zurück