(XSLT) XML-Pfad für Variablen rückwärts zusammensetzen (bis root)
-
Schönen guten Tag zusammen,
ich habe ein Problem beim transformieren einer XML-Datei in eine TXT-Datei..ich möchte aus einer XML-Datei einen bestimmten Wert und den jeweiligen Pfad zu diesem Wert in eine TXT-Datei speichern.
Mein Problem liegt beim zusammensetzen des Pfades. - Wie bekomme ich in einer Schleife die Pfade wie unten im Beispiel zusammen?
Ich komme nicht weiter, weil ich nicht weiß, mit was für Eingaben ich die Bezeichnungen der Nodes bekomme.So sieht die XML-Datei aus:
<root> <amps type="object"> <item0 type="object"> <energyLimit type="floatingpoint">5</energyLimit> <xMax type="floatingpoint">1000</xMax> <xMin type="floatingpoint">0</xMin> <yMax type="floatingpoint">250</yMax> <yMin type="floatingpoint">-250</yMin> </item0> <item1 type="object"> <energyLimit type="floatingpoint">10</energyLimit> <xMax type="floatingpoint">250</xMax> <xMin type="floatingpoint">-250</xMin> <yMax type="floatingpoint">1000</yMax> <yMin type="floatingpoint">0</yMin> </item0> </amps> </root>
So soll die TXT-Datei aussehen (mit Tabs getrennt):
Pfad energyLimit root.amps.item0 5 root.amps.item1 10
Und das hier habe ich bereits und komme nicht weiter (relevanter Teil):
<!-- Ich muss erstmal 'energyLimit' finden, um von dort aus den Pfad rückwärts zusammenzusetzen. --> <xsl:for-each select="amps/*"> <xsl:if test="starts-with(name(.), 'item')"> <xsl:for-each select="energyLimit"> <!-- Ab hier weiß ich nicht weiter.. Ich müsste irgendwie rückwärts bis root gehen, und dabei die Knotenpunkte zwischenspeichern. Nur wie? --> <xsl:value-of select=" ??? "/> </xsl:for-each> </xsl:if> </xsl:for-each>
Vielleicht hat jemand eine Ahnung, wie man soetwas bewerkstelligen kann.. Würde mich freuen.
Danke und schönen Gruß,
ChristianEdit 1: Titel angepasst.
Edit 2: Ich bin auf XPath und XSLT in der Version 1.4.0.0 angewiesen...
-
Endlich mal eine vernünftige Problembeschreibung
Probier es doch mal mit:
<xsl:for-each select="ancestor-or-self::*"> <xsl:value-of select="name()"/> </xsl:for-each>
-
Ach prima.
Ich wusste zB gar nicht, dass ich ancestor-or-self::* in eine for-Schleife schreiben kann. Brauche wohl nicht zu erwähnen, dass ich zum ersten Mal mit XSL ansich arbeite..Na super, funktioniert wunderbar und sieht bei mir jetzt so aus:
... <xsl:template match="root">Path<xsl:text> </xsl:text> <xsl:for-each select="amps/*"> <xsl:if test="starts-with(name(.), 'item0')"> <xsl:value-of select="name(energyLimit)"/> </xsl:if> </xsl:for-each> <xsl:text>
</xsl:text> <xsl:for-each select="amps/*"> <xsl:if test="starts-with(name(.), 'item')"> [b]<xsl:for-each select="ancestor-or-self::*">[/b] [b]<xsl:value-of select="name()"/>[/b] [b]<xsl:if test = "not(position()=last())" >[/b] [b]<xsl:text>.</xsl:text>[/b] [b]</xsl:if>[/b] [b]</xsl:for-each>[/b] <xsl:text> </xsl:text> <xsl:if test="class = 'class generic::CMyClass'"> <xsl:value-of select="energyLimit"/> </xsl:if> <xsl:text>
</xsl:text> </xsl:if> </xsl:for-each> </xsl:template> ...
Besten Dank und schönen Gruß,
Christian