JanineS: xsl | Elemente filtern und zusammenführen

Beitrag lesen

Hallo Thomas,

besten Dank für deine schnelle Hilfe! Ich kam bisher mit den doppelten Schleifen nicht klar. Dank deiner Lösung konnte ich meinen ursprünglichen Code noch etwas umschreiben und bin nun zu der Lösung noch gekommen:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:template match="roles">

    <roles>
      <xsl:for-each select="//role[not(text()=preceding-sibling::role/text())]">
        <xsl:variable name="name" select="name"/>
        <xsl:variable name="part" select="//role[name=$name]/part"/>
        <role>
          <name>
            <xsl:value-of select="$name"/>
          </name>
          <part>
            <xsl:value-of select="$part"/>
          </part>
        </role>
      </xsl:for-each>
    </roles>
  </xsl:template>

</xsl:stylesheet>

Ausgabe ist dann:

<?xml version="1.0" encoding="UTF-8"?>
<roles xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<role>
		<name>A</name>
		<part>1 2</part>
	</role>
	<role>
		<name>A</name>
		<part>1 2</part>
	</role>
	<role>
		<name>B</name>
		<part>1</part>
	</role>
</roles>

Viele Grüße JanineS