tt: Werte der Attribute im Ausgabedokument erhöhen

Hallo,

weiß jemand zufällig, wie man bei einer Umwandlung von XML zu XML mittels XSLT im generierten XML-Dokument ein ID-Attribut mit unterschiedlichen Werten erzeugt. Der ID Wert ist abhängig von auftreten der ID im erzeugten Dokument.

Zum Beispiel:

Ausgangsdokument:
<A >
  <B/>
  <C name="x"/>
  <C name="y"/>
  <C name="z"/>
</A>

Zu erzeugentes Dokument:
<M id="1">
  <B id="2">
   <C name="x" id="3"/>
  </B>
  <B id="4">
   <C name="y" id="5"/>
  </B>
  <B id="6">
   <C name="y" id="7"/>
  </B>
  <A id="8"/>
</M>

Da XSLT keine Programmiersprache ist, könnte man dies vielleicht mit Unterstützung von Java realisieren?

Vielen Dank schon mal im voraus.
Viele Grüße, Tini

  1. Hallo Tini,

    wenn Du einfach die Elemente fortlaufend im Attribut ID durchnummerieren möchtest sollte es ungefähr wie folgt funktionieren:

    <xsl:template match="@*|node()">
     xsl:copy
    <xsl:attribute name="id"><xsl:number count="//*" level="any"/>
    </xsl:attribute>

    <xsl:apply-templates />
    </xsl:copy>
    </xsl:template>

    Da XSLT keine Programmiersprache ist,

    Doch ist es.

    Viele Grüße

    Stefan

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Hallo Stefan,

      vielen Dank für deine schnelle Hilfe, es funktioniert.
      Nun soll folgende Erweiterung eingebaut werden:
      Nicht alle Elemente sollen das Attribut id besitzen, sondern nur ausgewählte Elemente. Das habe ich in zwei Transformationsschritten gelöst und es funktioniert ebenfalls.
      Jetzt möchte ich gerne ein weiteres Attribut type in das Zählen mit einbeziehen, aber nur dann wenn der Wert des Attributes das erste Mal auftritt. Tritt das Attribut ein zweites Mal mit diesem Wert auf  soll es nicht mehr gezählt werden und ihm soll der gleichen Wert wie beim ersten Auftreten zugewiesen werden.

      Zum Beispiel:
      XML-Dokument nach der ersten Transformation:
      <F>
       <A>
        <Z/>
        <G/>
       </A>
       <B            id="1">
         <C name="x" id="1" type="text"/>
        </B>
        <B>
         <C name="y" id="1" type="zahl"/>
        </B>
        <B           id="1" type="text">
         <C name="y" id="1"/>
        </B>
        <A           id="1" type="zahl"/>
      </F>
      Nach der zweiten Transformation soll das wie folgt aussehen:
      <F>
       <A>
        <Z/>
       </A>
       <B            id="1">
         <C name="x" id="2" type="3"/>
        </B>
        <B>
         <C name="y" id="4" type="5"/>
        </B>
        <B           id="6" type="3">
         <C name="y" id="7"/>
        </B>
        <A           id="8" type="5"/>
      </F>

      Mit folgenden Stylesheet wollte ich dies realisieren, klappt aber nicht.

      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:import href="copy.xsl" /> <!-- Kopier - Stylesheet-->
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

      • <xsl:template match="@id">
      • <xsl:param name="countxmi"><xsl:number count="//*[@id]" level="any" /></xsl:param>
      • <xsl:param name="counttype">
          <xsl:number count="//*[not(@type=preceding::F/@type)]" level="any" /></xsl:param>
          xls:choose
          <xsl:when test="type"><xsl:attribute name="id"><xsl:value-of select="$countxmi + 1" /></xsl:attribute></xsl:when>
          xsl:otherwise<xsl:attribute name="id"><xsl:value-of select="$countxmi" /></xsl:attribute> </xsl:otherwise>
          </xls:choose>
      • <xsl:attribute name="id"><xsl:value-of select="$countxmi + $counttype" /></xsl:attribute>
          <xsl:apply-templates />
          </xsl:template>
      • <xsl:template match="@type">
      • <xsl:param name="countxmi"><xsl:number count="//*[@id]" level="any" /></xsl:param>
      • <xsl:param name="counttype"><xsl:number count="//*[not(@type=preceding::F/@type)]" level="any" /></xsl:param>
      • <xsl:attribute name="type">
          <xsl:value-of select="$countxmi + $counttype" />
          </xsl:attribute>
          </xsl:template>
          </xsl:stylesheet>

      Viele Grüße, Tini