[Tustep-Liste] Geschachtelte Tags auflösen

Kuno Schälkle schaelkle at zdv.uni-tuebingen.de
Mo Dez 13 09:28:06 CET 2010


Lieber Herr Stahl,

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bei der Aufbereitung von XML-Dateien stoße ich immer wieder auf das
Problem, geschachtelte gleichnamige Tags auflösen zu müssen. Das sieht
in den Quelldaten beispielsweise so aus:

   xx <add> aa <add> bb> <add> cc </add> bb </add> aa </add> xx

Wie kann ich herausfinden, welche Anfang- und Ende-Tags
zusammengehören? Wenn es gelänge, mit einem klassichen #KOPIERE daraus

   xx <add1> aa <add2> bb <add3> cc </add3> bb </add2> aa </add1> xx

zu machen, könnte ich die Tags zuverlässig auflösen.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Sie möchten eine Lösung mit #KOPIERE.
Für den Fall, dass Sie keine solche erhalten,
hier eine Lösung mit TUSCIPT:

$$! quelle, ziel
$$ MODE VARIABLE

SET status = CHECK (quelle, READ, TUSTEP)
ERROR/STOP "QUELLE: ", status
SET status = CHECK (ziel, WRITE, TUSTEP)
ERROR/STOP "ZIEL: ", status

ACCESS q: READ/STREAM/RECORDS "{quelle}" ...
          s.z/u, atag+txt+etag, typ, stack
ACCESS z: WRITE/ERASE/STREAM  "{ziel}"   ...
          s.z/u, atag+txt+etag, num

COMPILE

LOOP/999999
  READ/EXIT q
  IF (atag.HN."add")  THEN
     SET count = COUNT (stack, ":<<add>>:")
     SET name = CONCAT ("add", count)
     SET atag = SET_TAG_NAME (atag, name)
  ENDIF
  IF (etag.HN."add")  THEN
     SET count = COUNT (stack, ":<<add>>:")
     SET name = CONCAT ("add", count)
     SET etag = SET_TAG_NAME (etag, name)
  ENDIF
  WRITE z
ENDLOOP

ENDCOMPILE

ENDACCESS q
ENDACCESS z

Herzliche Gruesse
Kuno Schaelkle 



Mehr Informationen über die Mailingliste Tustep-Liste