Announcement

Collapse
No announcement yet.

Hilfe bei Suche nach Anzahl vorheriger Knoten über Ebenen

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

  • Hilfe bei Suche nach Anzahl vorheriger Knoten über Ebenen

    hallo,

    ich komme gerade nicht weiter an einem Problem, das ich anfangs als recht trivial eingestuft habe...

    das ist ein Teil meines Xml Dokuments (fast alle Attribute der Übersicht halber weggeschnippselt):
    HTML Code:
    <Menu id=0>
      <Eintrag name=abc />
      <Eintrag name=xyz />
    </Menu>
    <Menu id=1>
      <Eintrag name =bla />
      <Eintrag name = blub />
      <Eintrag name = hihi />
    </Menu>
    <Menu id=2>
      <Eintrag name = ja />
      <Eintrag name = hmm />
    </Menu>
    ...
    Was ich nun tun möchte ist einfach alle Menues durchlaufen und darin alle Einträge und diese nummeriert ausgeben, wobei die Nummerierung nicht fürs aktuelle Menu, sondern "global" sein soll.
    Also quasi

    Code:
    // Menu 0
    [0] Eintrag abc
    [1] Eintrag xyz
    // Menu 1
    [2] Eintrag bla
    [3] Eintrag blub
    [4] Eintrag hihi
    // Menu 2
    [5] Eintrag ja
    [6] Eintrag hmm
    ...
    In meinem xsl habe ich dafür zwei for-Schleifen, die erste iteriert durch die Menues, die zweite innendrin durch die Einträge.

    Versucht habe ich es innerhalb der zweiten Schleife erst mit preceding-siblings aber da krieg ich nur die innerhalb eines Menu-Elements (naja, im Nachhinein auch logisch). Dann hab ich versucht ancestor::Menu/Eintrag zu counten aber das ging auch nicht, da krieg ich immer die Anzahl der Einträge im aktuellen Menu.
    Kann mir jemand nen Tipp geben?
    Ich weiß dass es ginge, wenn ich statt zwei Schleifen ein machen würde mit Menu/Eintrag. Aber das macht die Dinge an anderer Stelle wieder etwas komplizierter (ich hab nur einen kleinen Ausschnitt des ganzen gepostet), deshalb würde ich, wenn es irgendwie geht, mit dem 2-stufigen Schleifenansatz arbeiten.

    thx
    sth_Weird
    Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht

  • #2
    Viel Code hast du ja nicht gezeigt, und der ist noch nicht mal als Testeingabe zu gebrauchen, da es nicht mal wohlgeformtes XML ist.
    Also hier auch nur ein Code-Schnipsel:
    Code:
    <xsl:for-each select="Menu">
      <xsl:text>// Menu </xsl:text>
      <xsl:value-of select="@id"/>
      <xsl:for-each select="Eintrag">
         <xsl:text>[</xsl:text>
         <xsl:variable name="n"><xsl:number level="any"/></xsl:variable>
         <xsl:value-of select="$n - 1"/>
         <xsl:text>] Eintrag </xsl:text>
         <xsl:value-of select="@name"/>
      </xsl:for-each>
    </xsl:for-each>
    Zuletzt editiert von Martin Honnen; 19.02.2010, 19:34. Reason: Hatte übersehen, dass der Index mit 0 starten soll

    Comment


    • #3
      Danke für die Antwort.
      Habe es jetzt aber doch mit einer Schleife gelöst, weil ich die Antwort nicht rechtzeitig gesehen hab. Ich hangel mich zwar im xml so hoch und runter, aber es funzt.
      Sorry für meinen kargen bzw. fehlenden Xml-Code. Ich dachte meine Erläuterung wäre klar genug gewesen und wollte das Posting nicht unnötig aufblähen mit all den Ansätzen, die ich bisher hatte. Zumal ich mir sicher war, entweder die Lösung mit einer einzigen Schleife ist wirklich die einfachste, oder es gibt nen einfachen Befehl dafür und jemand schmeißt mir den "als Stichwort" zu. Die Ausgabe war auch nur ein triviales Beispiel um zu zeigen, an welche Informationen ich zu kommen versuchte, die tatsächliche Ausgabe sieht ganz anders aus.
      Trotzdem vielen Dank für deine Mühe!

      gruß
      sth_Weird
      Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht

      Comment


      • #4
        Es geht auch ohne For each
        For each nur für Knotenmenge benutzen
        kann bei grossen Datenmenge zu hohen Laufzeiten führen
        ein hoch dienen ist besser


        zum Testen xml
        Code:
        <?xml version="1.0"?>
        <root>
        	<tag>
        		<Menu id="0">
        			<Eintrag name="abc"/>
        			<Eintrag name="xyz"/>
        		</Menu>
        		<Menu id="1">
        			<Eintrag name="bla"/>
        			<Eintrag name="blub"/>
        			<Eintrag name="hihi"/>
        		</Menu>
        		<Menu id="2">
        			<Eintrag name="ja"/>
        			<Eintrag name="hmm"/>
        		</Menu>
        	</tag>
        </root>
        xsl
        der erste ist zum Hochdienen
        im zweiten Teile wird nach vorderen Knoten geschaut
        und dann im eignen Knoten

        Code:
        <?xml version="1.0"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        	<xsl:output method="text"/>
        	<xsl:variable name="all" select="//Eintrag"/>
        	<xsl:template match="/">
        		<xsl:apply-templates select="root"/>
        	</xsl:template>
        	<xsl:template match="root">
        		<xsl:apply-templates select="tag"/>
        	</xsl:template>
        	<xsl:template match="tag">
        		<xsl:apply-templates select="Menu"/>
        	</xsl:template>
        	<xsl:template match="Menu">
        		<xsl:value-of select="concat('//Menu',position(),'&#xA;')"/>
        		<xsl:apply-templates select="Eintrag"/>
        	</xsl:template>
        	<xsl:template match="Eintrag">
        		<xsl:value-of select="concat('[',count(../preceding-sibling::Menu/Eintrag/@name)+count(preceding-sibling::Eintrag/@name),']', ' Eintrag ',@name,'&#xA;')"/>
        	</xsl:template>
        </xsl:stylesheet>
        ergebnis
        Code:
        //Menu1
        [0] Eintrag abc
        [1] Eintrag xyz
        //Menu2
        [2] Eintrag bla
        [3] Eintrag blub
        [4] Eintrag hihi
        //Menu3
        [5] Eintrag ja
        [6] Eintrag hmm

        Comment

        Working...
        X