ThomasM: Variablen und Schleifen - Kopfknotenalarm!

Beitrag lesen

Hallo Janine,

Doch es wird keine Ausgabe erzeugt. Die Fehlermeldung meint, dass "A sequence of more than one item is not allowed as the first argument of fn:substring() ("000010", "000020", ...) " Muss ich da mit verschachtelten Schleifen arbeiten oder auch hier einfach alle allids/id in eine Variable schreiben, um sie als Sequenz einzulesen?

Das klappt mit etwas Umschreibung der vorherigen Transformation:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="list">
    <xsl:variable name="ids"
                  select="distinct-values(for $id in allids/id return substring($id, 1, 3))"/>
    <list>
      <xsl:for-each select="gebiete/gebiet">
        <xsl:variable name="aktgeb" select="."/>
        <xsl:if test="index-of($ids, $aktgeb) ge 1">
          <gebiet>
            <xsl:value-of select="$aktgeb"/>
          </gebiet>
        </xsl:if>
      </xsl:for-each>
    </list>
  </xsl:template>
</xsl:stylesheet>

Ergebnis:

<?xml version="1.0" encoding="UTF-8"?>
<list>
  <gebiet>010</gebiet>
  <gebiet>020</gebiet>
</list>

Die Belegung der Variable $ids ist hier etwas spezieller. Das for-in-return-Konstrukt liefert zunächst von allen IDs die ersten drei Zeichen und distinct-values() beschränkt das Ergebnis auf die individuellen Werte, also: ('010', '020'). Die weitere Verarbeitung läuft dann wie gehabt, nur ohne not().

Grüße,
Thomas