Birgit: Reihenfolge

Hallo zusammen,

ich habe ein Problem mit der Reihenfolge der Ausgabe von Informationen aus dem XML-Dokument. Wie kann ich verschiedene Angaben "herausziehen", wenn solche mehrfach vorkommen, d.h. wenn z.B. erst der "preQTxt" ausgelesen werden soll, dann die "ivuInstr", danach die "qstnLit" und dann wieder eine weitere "ivuInstr"? Habe ich das jetzt einigermaßen verständlich `rübergebracht? Ich hoffe.
Also es geht allgemein um das Verändern der Reihenfolge, wenn ein Tag-Name (mit verschiedenen Inhalten) mehrmal vorkommt. Wie kann ich da das jeweils richtige Tag auswählen?
...
<xsl:if test="preQTxt">
<xsl:for-each select="preQTxt">
<b>Vorfragetext: </b><xsl:value-of select="."/><br/>
</xsl:for-each>
</xsl:if>

<xsl:if test="ivuInstr">
<xsl:for-each select="ivuInstr">
<b>Interviewer-Anweisung: </b><xsl:value-of select="."/><br/>  </xsl:for-each>
</xsl:if>

<xsl:if test="qstnLit">
<xsl:for-each select="qstnLit">
<b>wörtliche Frage: </b><xsl:value-of select="."/><br/>   </xsl:for-each>
</xsl:if>
<xsl:if test="postQTxt">

<xsl:for-each select="postQTxt">
<b>Nachfragetext: </b><xsl:value-of select="."/><br/>
</xsl:for-each>
</xsl:if>

<xsl:if test="backward">
<xsl:for-each select="backward">     <b>Rückwärts-Verweis: </b><xsl:value-of select="."/><br/>
</xsl:for-each>
</xsl:if>

<xsl:if test="forward">
<xsl:for-each select="forward">      <b>Vorwärts-Verweis: </b>
<xsl:value-of select="."/><br/>
</xsl:for-each>
</xsl:if>
...

Dazu ein Ausschnitt aus der XML-Datei:
...
<var name="V109">
  <location StartPos="174" width="1"/>
  <labl>F30.VERSTAENDNIS V.PARTN</labl>
  <qstn ID="F.30">
  <ivuInstr>Falls mit einem Partner/einer Partnerin   zusammenlebend</ivuInstr>
  <qstnLit>Was glauben Sie, wie gut versteht Ihr Partner/Ihre Partnerin Sie - also Ihre Vorlieben, Ihre Abneigungen und Ihre Gefühle und die verschiedenen Probleme, die Sie haben? Glauben Sie, Ihr Partner/Ihre Partnerin versteht Sie ...</qstnLit>
  <ivuInstr>Int.: Vorgaben bitte vorlesen!</ivuInstr>
  </qstn>
...

Vielen Dank schonmal für eine Antwort!
Birgit

  1. Hallo Birgit,

    es gibt grundsätzlich zwei Möglichkeiten mit XSL auf XML Daten zuzugreifen.

    Verzeih, ich habe die exakten Fachausdrücke dafür vergessen :-)

    a) die Tiefen-Variante
    Die hast Du mit den for-each Schleifen gewählt. Dabei wird die Reihenfolge sehr fest gewählt.

    b) die flache Variante
    Hier bestimmen Templates wie für jedes Element vorgegangen wird.
    Also ist es grundsätzlich schonmal völlig unabhängig von der Reihenfolge der auftretenden Elemente in der XML Datei.

    Das hier wäre z.b. für alle Elemente:
    <xsl:template match="/">
    ....
    </xsl:template>

    Oder in diesem Template würden immer die Aktionen durchgeführt werden, wenn man auf das Element namens Test stösst.
    <xsl:template match="TEST">
    ...Aktionen...(z.b. HTML Code oder auch for-each Schleifen)
    </xsl:template>

    Für Dein Problem scheint mit die Variante b) wesentlich effizienter zu sein.

    Grüße
    -Marco-

  2. Hallo,

    Habe ich das jetzt einigermaßen verständlich `rübergebracht?

    Nein.

    Also es geht allgemein um das Verändern der Reihenfolge, wenn ein Tag-Name (mit verschiedenen Inhalten) mehrmal vorkommt. Wie kann ich da das jeweils richtige Tag auswählen?

    Keine Ahnung, ich weiss nicht was für dich "das Richtige" ist.
    Wie bestimmst du denn für dich was "das Richtige" ist?

    Du kannst natürlich mit position() auf Elemente mit dem selben Namen zugreifen und je nach dessen Position etwas mit dem Element anstellen.

    Grüße
    Thomas

    PS:
    Ich möchte dir nicht zu Nahe treten, aber derjenige der dein XML designt hat gehört geschlagen, Wirklich. Das ist ein gutes Bsp. dafür wo in 6 Monaten kein Mensch mehr weiss was das Ganze soll und was die einzelnen Elemente eigentlich bedeuten.

    Dein XSL kenne ich nicht, aber dein Ausschnitt sagt gar nichts darüber aus wie du dein XML verarbeitest (wo befinden sich diese xsl:if's, in einem Template in einer 'for-each' etc. ?) (vielleicht) auch deshalb sehen deine xsl:if's ziemlich sinnlos aus.

    PS2: @Marco
    Push (z.B. xsl:apply-templates) und Pull (z.B. xsl:for-each, xsl:value-of). ;-)