XML-Technologien
Posts 1-6 of 6
-
Christian Friedrich Premium MemberThe 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
- 03 Feb 2009, 11:28 am
-
Roman HuditschThe 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
- 03 Feb 2009, 12:07 pm
-
Christian Friedrich Premium MemberThe 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
- 03 Feb 2009, 1:23 pm
-
Roman HuditschThe 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
- 03 Feb 2009, 2:45 pm
-
Thomas Fitting Premium MemberThe 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
;-)
- 03 Feb 2009, 6:51 pm
-
Post visible to registered members
