ThomasM: xsl | Elemente filtern und zusammenführen

Beitrag lesen

Hallo Janine,

Und möchte in der Ausgabe die <name> filtern, sodass jeder Name nur 1x vorkommt, aber dafür alle <part> zusammenführen. Also in Textform so etwas: A: 1, 2 B: 1

Probiere es mit diesem XSLT-2.0-Ansatz:

<?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"
  exclude-result-prefixes="#all">

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

  <xsl:template match="roles">

    <xsl:variable name="names" select="fn:distinct-values(role/name)" as="xs:string*"/>
    <xsl:variable name="roles" select="role" as="node()*"/>

    <roles>
      <xsl:for-each select="$names">
        <xsl:variable name="name" select="."/>
        <role>
          <name>
            <xsl:value-of select="$name"/>
          </name>
          <part>
            <xsl:value-of select="fn:concat($name, ': ')"/>
            <xsl:for-each select="$roles/name[. = $name]">
              <xsl:value-of select="following-sibling::part"/>
              <xsl:if test="fn:position() != fn:last()">
                <xsl:text>, </xsl:text>
              </xsl:if>
            </xsl:for-each>
          </part>
        </role>
      </xsl:for-each>
    </roles>
  </xsl:template>

</xsl:stylesheet>

Ergebnis:

<?xml version="1.0" encoding="UTF-8"?>
<roles>
  <role>
    <name>A</name>
    <part>A: 1, 2</part>
  </role>
  <role>
    <name>B</name>
    <part>B: 1</part>
  </role>
</roles>

Grüße,
Thomas