XML-Technologien

XML-Technologien

Posts 1-6 of 6
  • Christian Friedrich
    Christian Friedrich    Premium Member
    The company name is only visible to registered members.
    Problem mit der Auswahl des nächsten Child-Elementes
    Hi @all,

    ich habe ein Problem mit dem holen des nächsten Child-Elementes in einer XML-Struktur. Diese schaut folgendermaßen aus:

    <skamod>
    <subskamod>
    <cat>1,80</cat>
    <id>1</id>
    </subskamod>
    <subskamod>
    <cat>1,20</cat>
    <id>2</id>
    </subskamod>
    </skamo>

    meine XSL schaut entsprechend so aus:

    <xsl:for-each select="//n1:skamod//n1:subskamod">
    <xsl:variable name="cat">
    <xsl:value-of select="translate(n1:cat, ',.' , '.' )" />
    </xsl:variable>
    <xsl:if test="string-length($cat) > 0">

    <xsl:variable name="id">
    <xsl:value-of select="n1:id" />
    </xsl:variable>

    <xsl:variable name="nextCat">
    <xsl:value-of select="..//n1:subskamod[position()+1]//n1:cat" />
    </xsl:variable>

    </xsl:if>
    </xsl:for-each>


    n1 ist ein Namespace, welcher auch funktioniert!

    Das Problem liegt hier im nextCat. Ich bekommen immer den Wert des aktuellen Eintrages aus der for-each-Schleife!

    Kann mir da vielleicht jemand weiter helfen oder einen Tipp geben?


    MfG

    Christian Friedrich
  • Roman Huditsch
    Roman Huditsch
    The company name is only visible to registered members.
    Re: Problem mit der Auswahl des nächsten Child-Elementes
    Hi Christian,

    <xsl:for-each select="//n1:skamod//n1:subskamod">
    Ich kenne deine Struktur un deinen aktuellen Kontext ja nicht genau, aber du solltest dir überlegen, ob du die // wirklich alle brauchst. In diesem Fall müsste zB
    <xsl:for-each select="//n1:skamod/n1:subskamod"> reichen. (die ersten // hab ich stehen lassen, weil ich eben deinen aktuellen Kontext nicht kenne)

    <xsl:variable name="id">
    <xsl:value-of select="n1:id" />
    </xsl:variable>

    Wieso speicherst du dir denn den id-Wert in einer eigenen Variable?

    <xsl:variable name="nextCat">
    <xsl:value-of select="..//n1:subskamod[position()+1]//n1:cat" />
    </xsl:variable>

    Hier sollte entsprechend deiner Beispielstruktur auch
    <xsl:value-of select="../n1:subskamod[...]/n1:cat" /> reichen
    Du bekommst deshalb keinen korrekten Wert, weil dir position() hier nicht den gewünschten Wert zurück gibt.
    Du möchtest ja die aktuelle Position des aktuellen Elements in der Verarbeitungssequenz um eins erhöhen.
    Quick 'n Dirty Lösung: Speichere die aktuelle Position in einer Variable und erhöhe die

    <xsl:variable name="pos">
    <xsl:value-of select="position()" />
    </xsl:variable>

    <xsl:variable name="nextCat">
    <xsl:value-of select="../n1:subskamod[$pos + 1]/n1:cat" />
    </xsl:variable>

    lg,
    Roman
  • Christian Friedrich
    Christian Friedrich    Premium Member
    The company name is only visible to registered members.
    Re^2: Problem mit der Auswahl des nächsten Child-Elementes
    Hallo Roman,

    danke für die schnelle Antwort. Ich jetzt weiter rumprobiert und habe festgestellt, dass die Funktion position() die Position zurück liefert, aber als String und nicht als numerischen Wert! Entsprechend muss der String Wert erst mit der Hilfsfunktion number() umgewandelt werden.
    Meine Lösung schaut dann im etwa folgendermaßen aus:

    <xsl:variable name="position" select="number(position()) + 1" />

    Das mit den // kommt daher, dass ich den ersten doppelt machen muss und hab es dann einfach so weitergeführt. Bin eigentlich eher im Javabereich heimisch und steh noch nicht so tief in der Materie von XSL.

    Also, nochmal vielen Dank für die Hilfe.


    Christian
  • Roman Huditsch
    Roman Huditsch
    The company name is only visible to registered members.
    Re^3: Problem mit der Auswahl des nächsten Child-Elementes
    Hi,

    Position() sollte laut Spezifikation die Position als xs:integer (positive Ganzzahl) zurück liefern.
    Welchen Prozessor verwendest du denn?
    Die // sind nicht so "gern" gesehen, weil sie nämlich die Performanz sehr negativ beeinflussen können.

    lg,
    Roman
  • Thomas Fitting
    Thomas Fitting    Premium Member
    The company name is only visible to registered members.
    Re^4: Problem mit der Auswahl des nächsten Child-Elementes
    Es geht auch (ein bisschen) einfacher:

    following-sibling::n1:subskamod/n1:cat

    ;-)
  • Post visible to registered members