hackmac: IF mit Schleife

Hallo,

kann mir bitte jemand helfen?!

Ich habe ein XML und möchte es mit XSLT in ein Tag mit HTML-Code transformieren.

XML sieht in etwa so aus:

<datenstrom>

<feld1_0>Conten1</feld1_0>

<feld1_1>Conten2</feld1_1>

</datenstrom>

dabei wird feld1 immer mit Unterschrich und einem Zähler hochgezählt.

Es kann NULL mal bis zu N mal vorkommen.

Wie sieht dazu das passende XSTL-Template aus? Kann mir da jemand bitte bitte bitte helfen??? :-)

Viele Grüße

hackmac

  1. Hallo hackmac,

    Wie sieht dazu das passende XSTL-Template aus? Kann mir da jemand bitte bitte bitte helfen??? :-)

    Ansatz mit einem entsprechend formulierten XPath-Zugriff und einer geordeneten HTML-Liste als Ausgabe:

    <xsl:template match="datenstrom">  
      <ol>  
        <xsl:apply-templates select="*[local-name()[starts-with(.,'feld1_')]]"/>  
      </ol>  
    </xsl:template>  
      
    <xsl:template match="*[local-name()[starts-with(.,'feld1_')]]">  
      <li>  
        <xsl:value-of select="."/>  
      </li>  
    </xsl:template>
    

    Ergebnis:

    <ol>  
      <li>Conten1</li>  
      <li>Conten2</li>  
    </ol>
    

    Grüße,
    Thomas

    1. Danke dir Thomas für deine HIlfe schon mal.

      Aber wie sieht es denn mit den anderen dynamischen Felder aus?
      da sind ja auch andere Felder, die mit einem Zähler mitwachsen und Felder, die nicht wachsen. sondern nun einmalig sind.
      <datenstrom>
      <feld1_0>Conten1</feld1_0>
      <feld1_1>Conten2</feld1_1>

      <feld2_0>Content3</feld2_0>
      <feld2_1>Content4</feld2_1>
      <name>Mustermann</name>
      </datenstrom>

      Ausgabe sollte in etwa so sein:
      Sehr geehrter Herr Mustermann,

      Nachfolgend Ihre Bestellung.
      aus dem Typ1:
      Content1
      Content2

      aus dem Typ2:
      Content3
      Content4

      hmmmh, kriegt man es damit auch hin??? Sorry, aber ich bin da echt n absoluter Neuling! ;-)

      Viele Grüße und herzlichen Dank

      hackmac

      1. Hallo hackmac,

        hmmmh, kriegt man es damit auch hin??? Sorry, aber ich bin da echt n absoluter Neuling! ;-)

        <http://de.selfhtml.org/xml/darstellung/index.htm@title=Dann bitte hier entlang.>

        Grüße,
        Thomas

        1. hmmh, schade! :-(
          Eig. muss ich es nicht von der Wiege aus können.
          Brauche es nur in diesem einen speziellen Anwendungsfall. Danach ist das Kapitel für mich abgeschlossen.
          Es werden keine weiteren Fälle mehr bei mir sein, von daher würd ich echt ungern mich komplett in die Materie einarbeiten wollen...

          1. Hallo hackmac,

            Brauche es nur in diesem einen speziellen Anwendungsfall. Danach ist das Kapitel für mich abgeschlossen.

            Na dann, teste diesen Code mit einem XSLT 2.0-Prozessor wie Saxon (aktuell 9.4) oder AltovaXML (aktuell 2012)
            [Bezug, Aufrufsyntax und mehr zum Thema XSLT]:

            <?xml version="1.0" encoding="UTF-8"?>  
            <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
              xmlns:xs="http://www.w3.org/2001/XMLSchema"  
              xmlns:fn="http://www.w3.org/2005/xpath-functions"  
              exclude-result-prefixes="fn xs">  
              
              <xsl:output method="xhtml" version="1.0" encoding="UTF-8" indent="yes"  
                doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"  
                doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>  
              
              <xsl:template match="datenstrom">  
              
                <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">  
              
                  <head><title>Test</title></head>  
              
                  <body>  
              
                    <p>Sehr geehrter Herr <xsl:value-of select="name"/>,</p>  
                    <p>Nachfolgend Ihre Bestellung.</p>  
              
                    <xsl:for-each-group select="*[fn:local-name()[fn:starts-with(.,'feld')]]"  
                                        group-by="fn:substring-before(local-name(),'_')">  
              
                      <p>aus dem Typ<xsl:value-of select="fn:position()"/>:</p>  
              
                      <ul>  
                        <xsl:for-each select="current-group()">  
                          <li><xsl:value-of select="."/></li>  
                        </xsl:for-each>  
                      </ul>  
              
                    </xsl:for-each-group>  
              
                  </body>  
              
                </html>  
              
              </xsl:template>  
              
            </xsl:stylesheet>
            

            HTML-Ergebnis:

            <?xml version="1.0" encoding="UTF-8"?>  
            <!DOCTYPE html  
              PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
            <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">  
               <head>  
                  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
                  <title>Test</title>  
               </head>  
               <body>  
                  <p>Sehr geehrter Herr Mustermann,</p>  
                  <p>Nachfolgend Ihre Bestellung.</p>  
                  <p>aus dem Typ1:</p>  
                  <ul>  
                     <li>Conten1</li>  
                     <li>Conten2</li>  
                  </ul>  
                  <p>aus dem Typ2:</p>  
                  <ul>  
                     <li>Content3</li>  
                     <li>Content4</li>  
                  </ul>  
               </body>  
            </html>
            

            Sinnvoll wäre noch ein Element anrede oder selbiges Attribut bei name.

            Versuche dennoch Grundkenntnisse zu erwerben, ansonsten führt die Nutzung des Beispiels nur zu vielen weiteren Fragen …

            Grüße,
            Thomas