Announcement

Collapse
No announcement yet.

XSL Optimierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XSL Optimierung

    Hallo,
    ich verarbeite XML-Daten aus einer Datenbank mittels XSLT. Da die Daten zum Teil sehr groß sind (100MB) dauert die Verarbeitung mit meinem jetzigen XSL ganz schön lange.
    Meine Frage wäre, wie man XSL optimieren kann. Kennt jemand Links o.ä. Ich habe leider nichts gefunden.
    Auf was sollte man achten?
    Macht es einen Unterschied, ob man <xsl:for-each> (verwende ich) oder <xsl:apply-templates> verwendet??

    Wäre schön, wenn mir jemand ein paar Infos dazu geben könnte.

  • #2
    Lies mal hier weiter: "There are Monsters in My Closet or How Not to Use XSLT".
    Zwischen xsl:for-each und xsl:apply-templates muss man immer abwägen, ich tendiere auch eher zu letzterem, aber manche Aufgabe lässt sich mit einem von beiden oder auch gemischt komfortabler oder effizienter lösen. Bei sehr großen Dokumenten hilft im Zweifelsfall nur ein Test. Falls möglich, kann auch XSLT 2.0 viel bewegen, da etliche Konstrukte wesentlich kompakter werden.

    Comment


    • #3
      Danke für die Hinweise.
      Ich verwende eigentlich ausschließlich xsl:for-each, weil ich damit besser zurecht komme - vor allem bei komplexen Strukturen bzw. wenn man nur bestimmte Sachen möchte oder wenn man eine neue Struktur erstellen möchte.
      Ich habe heute mal versucht mein Stylesheet umzuschreiben und bin auch schnell auf Probleme gestoßen.
      Heir mal ein Bespiel (vereinfachte Struktur):

      Aus folgender XML-Struktur
      Code:
      <Buch>
      	<Titel class="haupt1" id="1">Test</Titel>
      	<Titel class="zusatz" idref="1">Roman</Titel>
      	<Titel class="haupt2">Test 2</Titel>
      	<Person>Max Mustermann</Person>
      	<Vorlage>
      		<Person>aaa</Person>
      		<Titel class="haupt1" id="1">bbb</Titel>
      		<Titel class="haupt2">ccc</Titel>
      	</Vorlage>
      </Buch>
      Soll diese Struktur entstehen
      Code:
      <Ausgabe>
      	<Autor>Max Mustermann</Autor>
      	<Titel>
      		<haupt1>
      			<haupt>Test</haupt>
      			<zusatz>Roman</zusatz>
      		</haupt1>
      		<haupt2>
      			<haupt>Test2</haupt>
      		</haupt2>
      	</Titel>
      </Ausgabe>
      Mein xsl sieht bis jetzt so aus:
      Code:
      <xsl:template match="/">
      	<Ausgabe>
      		<xsl:apply-templates/>
      	</Ausgabe>
      </xsl:template>
      	
      <xsl:template match="Buch/Titel[@class = 'haupt1']">
      	<haupt><xsl:apply-templates/></haupt>
      </xsl:template>
      	
      <xsl:template match="Buch/Titel[@class = 'haupt2']">
      	<haupt><xsl:apply-templates/></haupt>
      </xsl:template>
      	
      <xsl:template match="Buch/Titel[@class = 'zusatz']">
      	<zusatz><xsl:apply-templates/></zusatz>
      </xsl:template>
      	
      <xsl:template match="Buch/Person">
      	<Autor><xsl:apply-templates/></Autor>
      </xsl:template>
      Weiter bin ich leider nicht gekommen
      Ich bekomme es auch nicht hin, dass der Autor über dem Titel steht.
      Sorry, es sind wahrscheinlich ganz simple Dinge, die hier fehlen, aber ich fand den anderen Weg immer einfacher.

      Comment


      • #4
        Übrigens ist XSLT2.0 möglich!

        Comment


        • #5
          Ohne den Gesamtzusammenhang zu kennen, würde ich diesen Ansatz wählen:
          Code:
          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
          
            <xsl:template match="/">
              <Ausgabe>
                <xsl:apply-templates select="Buch"/>
              </Ausgabe>  
            </xsl:template>
            
            <xsl:template match="Buch">
              <Autor><xsl:value-of select="Person"/></Autor>
              <Titel>
                <xsl:apply-templates select="Titel[@class='haupt1']"/>
              </Titel>    
            </xsl:template>
            
            <xsl:template match="Titel[@class='haupt1']">
              <haupt1>
                <haupt><xsl:value-of select="."/></haupt>
                <xsl:apply-templates select="following-sibling::Titel[@class='zusatz']"/>
              </haupt1>
              <xsl:apply-templates select="following-sibling::Titel[@class='haupt2']"/>
            </xsl:template>
          
            <xsl:template match="Titel[@class='haupt2']">
              <haupt2>
                <haupt><xsl:value-of select="."/></haupt>
                <!-- hier ggf. weiter mit:
                  <xsl:apply-templates select="following-sibling::Titel[@class='zusatz']"/>
                --> 
              </haupt2>
              <!-- usw. -->
            </xsl:template>
          
            <xsl:template match="Titel[@class='zusatz']">
              <zusatz><xsl:value-of select="."/></zusatz>  
            </xsl:template>
            
          </xsl:stylesheet>

          Comment


          • #6
            Okay, jetzt habe ich das mit <xsl:apply-templates> verstanden. Habe es eingebaut und es braucht wirklich sehr viel weniger Zeit!!!
            VIELEN DANK!!
            Zuletzt editiert von nipu; 09.10.2009, 14:05.

            Comment

            Working...
            X