ThomasM: Variablen und Schleifen - Kopfknotenalarm!

Beitrag lesen

Hallo Janine,

Meine IDs bestehen also immer aus der dreistelligen Nummer der Gebiete und einer fortlaufenden Zahl. Außer im Fall "999001". Wie kann ich nun eine Abfrage schreiben, die zunächst prüft, ob es IDs gibt, die nicht mit einer Gebiets-Nummer beginnen und diese anschließend ausgibt? Ausgabe also: <list> <id>999001</id> </list>

Das lässt sich so lösen:

<?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="geb" select="gebiete/gebiet"/>
    <list>
      <xsl:for-each select="allids/id">
        <xsl:variable name="aktid" select="."/>
        <xsl:if test="not(index-of($geb, substring($aktid, 1, 3)) ge 1)">
          <id>
            <xsl:value-of select="$aktid"/>
          </id>
        </xsl:if>
      </xsl:for-each>
    </list>
  </xsl:template>
</xsl:stylesheet>

Zur Erklärung: In $geb werden die Gebiete als Sequenz ('010', '020', '030', '040') eingelesen. Im for-each-Konstrukt erfolgt durch substring() der Abgleich mit den ersten drei Zeichen in den IDs. index-of() bestimmt die Position in der Sequenz (läuft ab 1). Gesucht sind also Ergebnisse, die nicht >= 1 sind (ge steht für greater or equal, hier könnte aber auch >= direkt stehen).

Grüße,
Thomas