Birgit: XSL-Tabelle

Hallo zusammen,

ich schlage mich immer noch mit dem gleichen Problem herum. Wie bekomme ich aus folgender XML-Datei (Ausschnitt) folgende Ausgabe:

1. Often
2. From time to time
3. Rarely
4. Never
5. DK
0. NA

Hier die XML-Datei dazu:
...
<dataDscr>
  <var name="V38">
   <location StartPos="124" width="1"/>
   <labl>Q3 POL DISCUSSION - CONVINCE FRIENDS</labl>
   <qstn ID="Q.3">
    <qstnLit>When you hold a strong opinion, do you ever find yourself persuading your friends, relatives or fellow workers to share your views? Does this happen ...? (READ OUT)</qstnLit>
    <backward>Last trend: EB47.0  Q.3</backward>
   </qstn>
   <catgry>
    <catValu>1</catValu>
    <txt>Often</txt>
   </catgry>
   <catgry>
    <catValu>2</catValu>
    <txt>From time to time</txt>
   </catgry>
   <catgry>
    <catValu>3</catValu>
    <txt>Rarely</txt>
   </catgry>
   <catgry>
    <catValu>4</catValu>
    <txt>Never</txt>
   </catgry>
   <catgry missing="Y">
    <catValu>5</catValu>
    <txt>DK</txt>
   </catgry>
   <catgry missing="Y">
    <catValu>0</catValu>
    <txt>NA</txt>
   </catgry>
   <catgry>
 ...

Bis jetzt konnte mir noch keiner weiterhelfen. Ich hoffe das ändert sich, ich bin nämlich schon ziemlich frustriert und komme nicht weiter! Danke schonmal!

Birgit

  1. Hallo,

    ich schlage mich immer noch mit dem gleichen Problem herum. Wie bekomme ich aus folgender XML-Datei (Ausschnitt) folgende Ausgabe:

    1. Often
    2. From time to time
    3. Rarely
    4. Never
    5. DK
    6. NA

    Hier die XML-Datei dazu:
    ...
    <dataDscr>
      <var name="V38">
    ...

    Bis jetzt konnte mir noch keiner weiterhelfen. Ich hoffe das ändert sich, ich bin nämlich schon ziemlich frustriert und komme nicht weiter! Danke schonmal!

    Was hast Du denn selbst versucht? Hier mal ein ganz einfacher Ansatz nur mit Wurzeltemplate:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output
        method="html"
        doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
        doctype-system="http://www.w3.org/TR/html401/loose.dtd"
        encoding="ISO-8859-1"
        version="4.01"
        media-type="text/html"
        indent="yes"
    />

    <xsl:template match="/">

    <html>
    <head>
    <title>Test by TM 08/02</title>
    </head>
    <body>
    <p>
    <xsl:for-each select="dataDscr/var/catgry">
      <xsl:value-of select="concat(catValu,'. ',txt)" /><br />
    </xsl:for-each>
    </p>
    </body>
    </html>

    </xsl:template>
    </xsl:stylesheet>

    MfG, Thomas

    1. Hallo Thomas,

      vielen Dank schonmal für Deine Antwort, aber bis jetzt tut sich da leider gar nichts! Was bedeutet eigentlich dieses "concat" in <xsl:value-of select="concat(catValu,'. ',txt)" />?

      Birgit

      Hallo,

      ich schlage mich immer noch mit dem gleichen Problem herum. Wie bekomme ich aus folgender XML-Datei (Ausschnitt) folgende Ausgabe:

      1. Often
      2. From time to time
      3. Rarely
      4. Never
      5. DK
      6. NA

      Hier die XML-Datei dazu:
      ...
      <dataDscr>
        <var name="V38">
      ...

      Bis jetzt konnte mir noch keiner weiterhelfen. Ich hoffe das ändert sich, ich bin nämlich schon ziemlich frustriert und komme nicht weiter! Danke schonmal!

      Was hast Du denn selbst versucht? Hier mal ein ganz einfacher Ansatz nur mit Wurzeltemplate:

      <?xml version="1.0" encoding="ISO-8859-1"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:output
          method="html"
          doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
          doctype-system="http://www.w3.org/TR/html401/loose.dtd"
          encoding="ISO-8859-1"
          version="4.01"
          media-type="text/html"
          indent="yes"
      />

      <xsl:template match="/">

      <html>
      <head>
      <title>Test by TM 08/02</title>
      </head>
      <body>
      <p>
      <xsl:for-each select="dataDscr/var/catgry">
        <xsl:value-of select="concat(catValu,'. ',txt)" /><br />
      </xsl:for-each>
      </p>
      </body>
      </html>

      </xsl:template>
      </xsl:stylesheet>

      MfG, Thomas

      1. Hallo,

        vielen Dank schonmal für Deine Antwort, aber bis jetzt tut sich da leider gar nichts!

        Ich habe Deinen XML-Code so verwendet (test.xml):

        <?xml version="1.0"?>
        <?xml-stylesheet href="test.xsl" type="text/xsl"?>
        <dataDscr>
          <var name="V38">
           <location StartPos="124" width="1"/>
           <labl>Q3 POL DISCUSSION - CONVINCE FRIENDS</labl>
           <qstn ID="Q.3">
            <qstnLit>When you hold a strong opinion, do you ever find yourself persuading your friends, relatives or fellow workers to share your views? Does this happen ...? (READ OUT)</qstnLit>
            <backward>Last trend: EB47.0  Q.3</backward>
           </qstn>
           <catgry>
            <catValu>1</catValu>
            <txt>Often</txt>
           </catgry>
           <catgry>
            <catValu>2</catValu>
            <txt>From time to time</txt>
           </catgry>
           <catgry>
            <catValu>3</catValu>
            <txt>Rarely</txt>
           </catgry>
           <catgry>
            <catValu>4</catValu>
            <txt>Never</txt>
           </catgry>
           <catgry missing="Y">
            <catValu>5</catValu>
            <txt>DK</txt>
           </catgry>
           <catgry missing="Y">
            <catValu>0</catValu>
            <txt>NA</txt>
           </catgry>
          </var>
        </dataDscr>

        Dazu kommt das gepostete Stylesheet test.xsl und das Ergebnis ist in IE und Mozilla:

        1. Often
        2. From time to time
        3. Rarely
        4. Never
        5. DK
        0. NA

        Was bedeutet eigentlich dieses "concat" in <xsl:value-of select="concat(catValu,'. ',txt)" />?

        concat() ist eine XPath-Funktion, die Zeichenketten zusammensetzt (konkateniert). Es wird also der Inhalt von catValu mit Punkt und Leerzeichen und dem Inhalt von txt verknuepft und ausgegeben.

        MfG, Thomas

        1. Hallo Thomas,

          vielen Dank für Deine Hilfe, jetzt hat es endlich geklappt! Tut mir leid, dass ich meinen Thread gestern nicht verfolgt habe. Ich war auf einer Beerdigung und den ganzen Tag nicht am PC. Übrigens kann ich meinen Thread im Archiv nicht mehr lesen, bekomme immer eine Fehlermeldung. Mal sehen.

          Also wenn ich nochmal Fragen zu XSL habe (die werden schon bald kommen!), dann weiß ich ja, an wen ich mich wenden kann...

          Vielen Dank nochmal und viele Grüße aus Köln!
          Birgit

          Hallo,

          vielen Dank schonmal für Deine Antwort, aber bis jetzt tut sich da leider gar nichts!

          Ich habe Deinen XML-Code so verwendet (test.xml):

          <?xml version="1.0"?>
          <?xml-stylesheet href="test.xsl" type="text/xsl"?>
          <dataDscr>
            <var name="V38">
             <location StartPos="124" width="1"/>
             <labl>Q3 POL DISCUSSION - CONVINCE FRIENDS</labl>
             <qstn ID="Q.3">
              <qstnLit>When you hold a strong opinion, do you ever find yourself persuading your friends, relatives or fellow workers to share your views? Does this happen ...? (READ OUT)</qstnLit>
              <backward>Last trend: EB47.0  Q.3</backward>
             </qstn>
             <catgry>
              <catValu>1</catValu>
              <txt>Often</txt>
             </catgry>
             <catgry>
              <catValu>2</catValu>
              <txt>From time to time</txt>
             </catgry>
             <catgry>
              <catValu>3</catValu>
              <txt>Rarely</txt>
             </catgry>
             <catgry>
              <catValu>4</catValu>
              <txt>Never</txt>
             </catgry>
             <catgry missing="Y">
              <catValu>5</catValu>
              <txt>DK</txt>
             </catgry>
             <catgry missing="Y">
              <catValu>0</catValu>
              <txt>NA</txt>
             </catgry>
            </var>
          </dataDscr>

          Dazu kommt das gepostete Stylesheet test.xsl und das Ergebnis ist in IE und Mozilla:

          1. Often
          2. From time to time
          3. Rarely
          4. Never
          5. DK
          6. NA

          Was bedeutet eigentlich dieses "concat" in <xsl:value-of select="concat(catValu,'. ',txt)" />?

          concat() ist eine XPath-Funktion, die Zeichenketten zusammensetzt (konkateniert). Es wird also der Inhalt von catValu mit Punkt und Leerzeichen und dem Inhalt von txt verknuepft und ausgegeben.

          MfG, Thomas

          1. hallo Birgit,

            Tut mir leid, dass ich meinen Thread gestern nicht verfolgt habe.

            das habe ich dir vorgeworfen. wir beide heissen Thomas. bitte nicht verwechseln ;-)

            Grüße
            Thomas (J.S.)

            1. Sorry,

              soll nicht wieder vorkommen!

              Jetzt habe ich aber direkt die nächste Frage (habe ich ja schon angekündigt): in meinem Codebuch gibt es einige mehr Variablen (var name="V38" hatte ich eben im Beispiel). Wie kann ich jetzt die Antworten nur dieser einen Variablen ausgeben ohne die Antworten aller anderen Variablen mitzubekommen? War das jetzt verständlich? Ich hoffe!

              Bis jetzt habe ich Folgendes versucht, aber ich bekomme gar keine Ausgabe:

              <xsl:if test="var/@name='V38'">
              <xsl:for-each select="dataDscr/var/catgry">
                  <xsl:value-of select="concat(catValu,'. ',txt)" /><br />
              </xsl:for-each>
              </xsl:if>

              Danke schonmal!
              Birgit

              hallo Birgit,

              Tut mir leid, dass ich meinen Thread gestern nicht verfolgt habe.

              das habe ich dir vorgeworfen. wir beide heissen Thomas. bitte nicht verwechseln ;-)

              Grüße
              Thomas (J.S.)

              1. Hallo,

                Bis jetzt habe ich Folgendes versucht, aber ich bekomme gar keine Ausgabe:

                <xsl:if test="var/@name='V38'">

                In diesem Kontext:
                <xsl:if test="dataDscr/var/@name='V38'">

                MfG, Thomas

                1. Hallo,

                  das habe ich auch ausprobiert, aber dann bekomme ich gar keine Ausgabe, auch nicht mehr die eben mühsam erarbeitete (1. Often etc.).

                  Vielleicht steht das <xsl:if ...> nur an falscher Stelle. Ich weiß es nicht. Fällt Dir dazu noch etwas ein?

                  Birgit

                  Hallo,

                  Bis jetzt habe ich Folgendes versucht, aber ich bekomme gar keine Ausgabe:

                  <xsl:if test="var/@name='V38'">

                  In diesem Kontext:
                  <xsl:if test="dataDscr/var/@name='V38'">

                  MfG, Thomas

                  1. Hallo,

                    das habe ich auch ausprobiert, aber dann bekomme ich gar keine Ausgabe, auch nicht mehr die eben mühsam erarbeitete (1. Often etc.).

                    Vielleicht steht das <xsl:if ...> nur an falscher Stelle. Ich weiß es nicht. Fällt Dir dazu noch etwas ein?

                    So hat es bei mir mit der genannten test.xml funktioniert:

                    <xsl:if test="dataDscr/var/@name='V38'">
                    <xsl:for-each select="dataDscr/var/catgry">
                      <xsl:value-of select="concat(catValu,'. ',txt)" /><br />
                    </xsl:for-each>
                    </xsl:if>

                    MfG, Thomas

                    1. Hallo Thomas,

                      genauso habe ich es auch gemacht, aber - wie gesagt - keine Ausgabe. Naja, ich probiere mal weiter. Danke für Deine Hilfe!

                      Birgit

                      Hallo,

                      das habe ich auch ausprobiert, aber dann bekomme ich gar keine Ausgabe, auch nicht mehr die eben mühsam erarbeitete (1. Often etc.).

                      Vielleicht steht das <xsl:if ...> nur an falscher Stelle. Ich weiß es nicht. Fällt Dir dazu noch etwas ein?

                      So hat es bei mir mit der genannten test.xml funktioniert:

                      <xsl:if test="dataDscr/var/@name='V38'">
                      <xsl:for-each select="dataDscr/var/catgry">
                        <xsl:value-of select="concat(catValu,'. ',txt)" /><br />
                      </xsl:for-each>
                      </xsl:if>

                      MfG, Thomas

                    2. hallo Birgit, Thomas

                      Vielleicht steht das <xsl:if ...> nur an falscher Stelle. Ich weiß es nicht. Fällt Dir dazu noch etwas ein?

                      poste bitte deine xsl datei.

                      So hat es bei mir mit der genannten test.xml funktioniert:

                      <xsl:if test="dataDscr/var/@name='V38'">

                      ich hätte es eher mit
                      <xsl:if test="dataDscr/var[@name='V38']"> versucht.

                      grüße
                      thomas (j.s.)

                      1. Hallo Thomas,

                        hier ist meine XS-Datei. Vielleicht fällt Dir ja noch etwas ein! Ich bekomme jdenfalls nicht das erwünschte Ergebnis mit der if-Anweisung.

                        <?xml version="1.0" encoding="iso-8859-1"?>
                        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

                        <xsl:output method="html"/>

                        <xsl:template match="codeBook">
                           <html>
                              <head>
                                 <title>Test-Codebuch</title>
                              </head>
                              <body bgcolor="#008000">
                                 <h1>Test-Codebuch</h1>
                                 <xsl:apply-templates select="stdyDscr" />
                                 <xsl:apply-templates select="fileDscr" />
                                 <xsl:apply-templates select="dataDscr" />
                              </body>
                          </html>
                        </xsl:template>

                        <xsl:template match="stdyDscr">
                           Title: <i><xsl:value-of select="citation/titlStmt/titl" /></i>
                           <p>Subtitle: <i><xsl:value-of select="citation/titlStmt/subTitl" /></i></p>
                           <xsl:for-each select="citation/rspStmt/AuthEnty">
                             <p>Primary Investigator(s): <i><xsl:value-of select="." />, </i></p>
                           </xsl:for-each>
                           <p>Producer Data Collection: <i><xsl:value-of select="citation/prodStmt/producer" /></i></p>
                           <p>Funding Agency: <i><xsl:value-of select="citation/prodStmt/fundAg" /></i></p>
                           <p>Depositor: <i><xsl:value-of select="citation/distStmt/depositr" /></i></p>
                           <p>Date of Deposit: <i><xsl:value-of select="citation/distStmt/depDate" /></i></p>
                           <p>Topic Classification: <i><xsl:value-of select="stdyInfo/subject/topcClas" /></i></p>
                           <p>Abstract: <i><xsl:value-of select="stdyInfo/abstract" /></i></p>
                           <p>Date of Collection: <i><xsl:value-of select="stdyInfo/sumDscr/collDate" /></i></p>
                           <p>Universe: <i><xsl:value-of select="stdyInfo/sumDscr/universe" /></i></p>
                           <p>Notes: <i><xsl:value-of select="stdyInfo/notes" /></i></p>
                           Data Collectors:
                           <xsl:for-each select="method/dataColl/dataCollector">
                               <p><i><xsl:value-of select="." /></i></p>
                           </xsl:for-each>
                           <p>Sampling Procedure: <i><xsl:value-of select="method/dataColl/sampProc" /></i></p>
                           <xsl:apply-templates select="fileDscr" />
                        </xsl:template>

                        <xsl:template match="fileDscr">
                            <p>Type of File: <i><xsl:value-of select="fileTxt/fileType" /></i></p>
                         </xsl:template>

                        <xsl:template match="dataDscr">
                           <p><u><xsl:value-of select="var/@name" /></u></p>
                           <p>Location: <i><xsl:value-of select="var/location/@StartPos" /></i></p>
                           <p>Width: <i><xsl:value-of select="var/location/@width" /></i></p>
                           <p>Variable Group Label: <i><xsl:value-of select="var/labl" /></i></p>
                           <p>Literal Question: <i><xsl:value-of select="var/qstn/qstnLit" /></i></p>
                           <p>Backflow: <i><xsl:value-of select="var/qstn/backward" /></i></p>
                        <xsl:if test="var/@name='V38'">
                        <xsl:for-each select="var/catgry">
                          <i><xsl:value-of select="concat(catValu,'. ',txt)" /></i><br />
                        </xsl:for-each>
                        </xsl:if>
                        </xsl:template>
                        </xsl:stylesheet>

                        hallo Birgit, Thomas

                        Vielleicht steht das <xsl:if ...> nur an falscher Stelle. Ich weiß es nicht. Fällt Dir dazu noch etwas ein?

                        poste bitte deine xsl datei.

                        So hat es bei mir mit der genannten test.xml funktioniert:

                        <xsl:if test="dataDscr/var/@name='V38'">

                        ich hätte es eher mit
                        <xsl:if test="dataDscr/var[@name='V38']"> versucht.

                        grüße
                        thomas (j.s.)

                        1. Hallo Birgit,

                          hier ist meine XS-Datei. Vielleicht fällt Dir ja noch etwas ein! Ich bekomme jdenfalls nicht das erwünschte Ergebnis mit der if-Anweisung.

                          <xsl:template match="dataDscr">
                             <p><u><xsl:value-of select="var/@name" /></u></p>
                             <p>Location: <i><xsl:value-of select="var/location/@StartPos" /></i></p>

                          so selectierst du immer den ersten 'var' innerhalb von 'dataDscr'

                          <xsl:if test="var/@name='V38'">
                          <xsl:for-each select="var/catgry">

                          dann selektiert jede 'var/catgry' und gibst du das ergebniss aus.

                          ich habe mal den sheet (hier abgekürz auf das wesentliche) umgeschriben:

                          <?xml version="1.0" encoding="ISO-8859-1"?>
                          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
                          <xsl:output method="html"/>

                          <xsl:template match="codeBook">
                             <html>
                                <head>
                                   <title>Test-Codebuch</title>
                                </head>
                                <body bgcolor="#008000">
                                   <h1>Test-Codebuch</h1>
                                   <xsl:apply-templates select="dataDscr" />
                                </body>
                            </html>
                          </xsl:template>

                          <xsl:template match="dataDscr/var">
                             <p><u><xsl:value-of select="@name" /></u></p>
                             <p>Location: <i><xsl:value-of select="location/@StartPos" /></i></p>
                             <p>Width: <i><xsl:value-of select="location/@width" /></i></p>
                             <p>Variable Group Label: <i><xsl:value-of select="labl" /></i></p>
                             <p>Literal Question: <i><xsl:value-of select="qstn/qstnLit" /></i></p>
                             <p>Backflow: <i><xsl:value-of select="qstn/backward" /></i></p>
                               <xsl:if test="@name='V38'">
                                <xsl:for-each select="catgry">
                                   <i><xsl:value-of select="concat(catValu,'. ',txt)" /></i><br />
                                </xsl:for-each>
                               </xsl:if>
                          </xsl:template>
                          </xsl:stylesheet>

                          grüße
                          thomas

                          1. Super Thomas, das klappt ja wirklich! Ich danke Dir!

                            Viele Grüße
                            Birgit

                            Hallo Birgit,

                            hier ist meine XS-Datei. Vielleicht fällt Dir ja noch etwas ein! Ich bekomme jdenfalls nicht das erwünschte Ergebnis mit der if-Anweisung.

                            <xsl:template match="dataDscr">
                               <p><u><xsl:value-of select="var/@name" /></u></p>
                               <p>Location: <i><xsl:value-of select="var/location/@StartPos" /></i></p>

                            so selectierst du immer den ersten 'var' innerhalb von 'dataDscr'

                            <xsl:if test="var/@name='V38'">
                            <xsl:for-each select="var/catgry">

                            dann selektiert jede 'var/catgry' und gibst du das ergebniss aus.

                            ich habe mal den sheet (hier abgekürz auf das wesentliche) umgeschriben:

                            <?xml version="1.0" encoding="ISO-8859-1"?>
                            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
                            <xsl:output method="html"/>

                            <xsl:template match="codeBook">
                               <html>
                                  <head>
                                     <title>Test-Codebuch</title>
                                  </head>
                                  <body bgcolor="#008000">
                                     <h1>Test-Codebuch</h1>
                                     <xsl:apply-templates select="dataDscr" />
                                  </body>
                              </html>
                            </xsl:template>

                            <xsl:template match="dataDscr/var">
                               <p><u><xsl:value-of select="@name" /></u></p>
                               <p>Location: <i><xsl:value-of select="location/@StartPos" /></i></p>
                               <p>Width: <i><xsl:value-of select="location/@width" /></i></p>
                               <p>Variable Group Label: <i><xsl:value-of select="labl" /></i></p>
                               <p>Literal Question: <i><xsl:value-of select="qstn/qstnLit" /></i></p>
                               <p>Backflow: <i><xsl:value-of select="qstn/backward" /></i></p>
                                 <xsl:if test="@name='V38'">
                                  <xsl:for-each select="catgry">
                                     <i><xsl:value-of select="concat(catValu,'. ',txt)" /></i><br />
                                  </xsl:for-each>
                                 </xsl:if>
                            </xsl:template>
                            </xsl:stylesheet>

                            grüße
                            thomas

  2. hallo Birgit

    ich schlage mich immer noch mit dem gleichen Problem herum.

    selber schuld!
    ich habe dir schon gestern oder vorgestern einen kopletten xsl-sheet hier auf deine frage gepostet, wenn du dir nicht die mühe machst deinen eigenen thread zu verfolgen, kann man dir auch nicht helfen.

    Wie bekomme ich aus folgender XML-Datei (Ausschnitt) folgende Ausgabe:

    Hier die XML-Datei dazu:

    vorausgesetzt:
     dein xml schaut so aus
    <dataDscr>
      <var name="V38">
    ...
      </var>
    </dataDscr>

    ------------------
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="dataDscr">
       <html>
          <body>
             <h1>Tabelle Variable 38</h1>
             <table border="1">
                <tr>
                   <td>(Wert)</td><td>(Antwort)</td>
                </tr>
                <xsl:apply-templates select="var"/>
             </table>
          </body>
       </html>
    </xsl:template>

    <xsl:template match="var">
       <xsl:apply-templates select="catgry"/>
    </xsl:template>

    <xsl:template match="catgry">
       <tr>
          <td><xsl:apply-templates select="catValu" />xsl:text.</xsl:text></td>

    <td><xsl:apply-templates select="txt" /></td>
       </tr>
    </xsl:template>
    </xsl:stylesheet>
    --------------------

    Bis jetzt konnte mir noch keiner weiterhelfen. Ich hoffe das ändert sich, ich bin nämlich schon ziemlich frustriert

    siehe ganz oben meine meinung.
    dein thread ist bald im archiv zu lesen http://forum.de.selfhtml.org/archiv/2002/8/21557/

    grüße
    thomas