XSL bestimmten Knotenbereich bestimmen
Sven Petri
- xsl
0 Dragon0 Sven Petri0 Dragon
Hallo,
ich möchte mithilfe von XSL nur eine bestimmte Anzahl von Werten aus meinem XML ausgeben.
Die Knoten des XML befinden sich alle auf einer Ebene und ich muss quasi den Start und den Endpunkt im XSL bestimmen. Leider gelingt mir das nicht.
Ich poste mal mein XML und das dazugehörige XSL in der Hoffnung jemand kann mir auf die Sprünge helfen.
Ich möchte die Werte von node1 als Überschriften ausgeben und die Werte zwischen den jeweiligen node1 Knoten als Unterpunkte. Leider liegen sie auf einer Ebene und ich finde keine Möglichkeit mithilfe von XPath die auszugebenden Knoten auf einen Bereich zwischen zwei Knoten zu beschränken. xsl:preceding-sibling und xsl:following-sibling geben jeweils alle vor/dahinter liegenden Knoten an.
Wie wäre ein einfaches "von node1 bis node1" in XPath, bzw. XSL möglich?
<main>
<node1>
<label>Test1</label>
<position>1.1</position>
</node1>
<node1>
<label>Test2</label>
<position>1.2</position>
</node1>
<node2>
<nodelabel>Test3</nodelabel>
<position>1.2.1</position>
</node2>
<node3>
<nodelabel>Test4</nodelabel>
<position>1.2.1.1</position>
</node3>
<node1>
<nodelabel>Test5</nodelabel>
<position>1.3</position>
</node1>
<!-- usw.-->
</main>
Folgendes XSL-Template soll diesen XML-Baum verarbeiten:
<xsl:template name="node">
<xsl:for-each select="*[string-length(position)=3]">
<!-- Die Überschrift wird anders formatiert-->
<xsl:value-of select="nodelabel"/>
<!-- Ende Überschrift-->
<!-- Ein kleines Beispiel von vielen gescheiterten versuchen-->
<xsl:for-each select="following-sibling::node()">
<!-- Hier sollen die dazwischenliegenden Einträge ausgegeben werden-->
<xsl:value-of select="nodelabel"/>
<!-- Ende der Einträge-->
</xsl:for-each>
<!-- Ende schlechtes Beispiel-->
</xsl:for-each>
</xsl:template>
Hallo
ich möchte mithilfe von XSL nur eine bestimmte Anzahl von Werten aus meinem XML ausgeben.
Die Knoten des XML befinden sich alle auf einer Ebene und ich muss quasi den Start und den Endpunkt im XSL bestimmen. Leider gelingt mir das nicht.
Ich poste mal mein XML und das dazugehörige XSL in der Hoffnung jemand kann mir auf die Sprünge helfen.
Na vieleicht hilft Dir dieses.
*** Datei node.xsl ****
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- xmlns bedeutet Namensraum -->
<xsl:output method="html"/>
<xsl:template match="/">
<!-- abarbeitung ab root-tag: /, sonst z.B. "main" -->
<TABLE BORDER="1">
<TR>
<TD><H1>Node</H1></TD>
<TD><H2>Label</H2></TD>
<TD><H4>Position</H4></TD>
</TR>
<xsl:for-each select="main">
xsl:apply-templates/
<!-- Es wird fuer jeden Datensatz nach einem passenden Template gesucht -->
</xsl:for-each>
</TABLE>
</xsl:template>
<xsl:template match="node1">
<TR BGCOLOR="lightblue">
<TD><H2>node1 </H2></TD>
<TD><H3><xsl:value-of select="label"/><xsl:value-of select="nodelabel"/></H3></TD>
<TD><H4><xsl:value-of select="position"/></H4></TD>
</TR>
</xsl:template>
<!-- Unterdruecke Anzeige fuer node2 -->
<xsl:template match="node2">
</xsl:template>
<!-- Anzeige fuer node3 in anderer farbe -->
<xsl:template match="node3">
<TR BGCOLOR="red">
<TD><H2>node3</H2></TD>
<TD><H3><xsl:value-of select="label"/><xsl:value-of select="nodelabel"/></H3></TD>
<TD><H4><xsl:value-of select="position"/></H4></TD>
</TR>
</xsl:template>
</xsl:stylesheet>
**** Datei node.xml ****
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<!--
XML-Test 08-2004
-->
<!-- Verschönerung mit extensible stylesheet language -->
<?xml-stylesheet href="node.xsl" type="text/xsl"?>
<!-- geht auch mit css: "style.css" type="text/css", aber nicht so gut -->
<!DOCTYPE main [
<!-- ELEMENT-Zeilen können in beliebiger Reihenfolge stehen -->
<!ELEMENT main (node1,node2?,node3?)+>
<!-- + steht für ein oder mehrere -->
<!ELEMENT node1 (nodelabel?,label?,position?)>
<!ELEMENT node2 (nodelabel?,label?,position?)>
<!ELEMENT node3 (nodelabel?,label?,position?)>
<!-- ? steht für optional, Reihenfolge muß exakt eingehalten werden
(tag1?,tag2?,...)+ steht für beliebig -->
<!ELEMENT label (#PCDATA)>
<!-- #PCDATA = parced character data = belebige Zeichenkette -->
<!ELEMENT position (#PCDATA)>
]>
<main>
<node1>
<label>Test1</label>
<position>1.1</position>
</node1>
<node1>
<label>Test2</label>
<position>1.2</position>
</node1>
<node2>
<nodelabel>Test3</nodelabel>
<position>1.2.1</position>
</node2>
<node3>
<nodelabel>Test4</nodelabel>
<position>1.2.1.1</position>
</node3>
<node1>
<nodelabel>Test5</nodelabel>
<position>1.3</position>
</node1>
<!-- usw.-->
</main>
Ich hoffe es hilft etwas weiter.
mfg
Das Schmunzelmonster
Ps.: Ist der Wechsel zwischen label (ähm sollte das nich lable heissen?) und nodelabel eigendlich beabsichtigt??
Danke erstmal für die Antwort, bin grade nicht zuhause und schau es mir später an. Auf den ersten Blick scheint es allerdings die Lösung zu meinem Problem zu sein, Danke!
Mit dem Wechsel hast Du natürlich Recht, das ist ein Tippfehler von mir. Ich wollte das eigentliche XML verkürzen und vereinfachen und habe dabei den Fehler mit der Bezeichnung label / nodelabel gemacht.
Grüsse,
Sven
<main>
<node1>
<label>Test1</label>
<position>1.1</position>
</node1>
<node1>
<label>Test2</label>
<position>1.2</position>
</node1>
<node2>
<nodelabel>Test3</nodelabel>
<position>1.2.1</position>
</node2>
<node3>
<nodelabel>Test4</nodelabel>
<position>1.2.1.1</position>
</node3>
<node1>
<nodelabel>Test5</nodelabel>
<position>1.3</position>
</node1>
<!-- usw.-->
</main>Ps.: Ist der Wechsel zwischen label (ähm sollte das nich lable heissen?) und nodelabel eigendlich beabsichtigt??
hallo
Danke erstmal für die Antwort, bin grade nicht zuhause und schau es mir später an. Auf den ersten Blick scheint es allerdings die Lösung zu meinem Problem zu sein, Danke!
büdde büdde :-))
Mit dem Wechsel hast Du natürlich Recht, das ist ein Tippfehler von mir. Ich wollte das eigentliche XML verkürzen und vereinfachen und habe dabei den Fehler mit der Bezeichnung label / nodelabel gemacht.
Na dann, nochmal ohne nodelabel.
**** Datei: node.xsl ****
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<!-- abarbeitung ab root-tag: /, sonst z.B. "main" -->
<TABLE BORDER="1">
<TR>
<TD><H1>Node</H1></TD>
<TD><H2>Label</H2></TD>
<TD><H4>Position</H4></TD>
</TR>
<xsl:for-each select="main">
xsl:apply-templates/
<!-- Es wird fuer jeden Datensatz nach einem passenden Template gesucht -->
</xsl:for-each>
</TABLE>
</xsl:template>
<xsl:template match="node1">
<TR BGCOLOR="lightblue">
<TD><H2>node1</H2></TD>
<TD><H3><xsl:value-of select="label"/></H3></TD>
<TD><H4><xsl:value-of select="position"/></H4></TD>
</TR>
</xsl:template>
<!-- Unterdruecke Anzeige fuer node2 -->
<xsl:template match="node2">
</xsl:template>
<!-- Anzeige fuer node3 in anderer farbe -->
<xsl:template match="node3">
<TR BGCOLOR="red">
<TD><H2>node3</H2></TD>
<TD><H3><xsl:value-of select="label"/></H3></TD>
<TD><H4><xsl:value-of select="position"/></H4></TD>
</TR>
</xsl:template>
</xsl:stylesheet>
**** Datei: node.xml ****
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<!--
XML-Lable 08-2004
-->
<!-- Verschönerung mit extensible stylesheet language -->
<?xml-stylesheet href="node.xsl" type="text/xsl"?>
<!-- geht auch mit css: "style.css" type="text/css", aber nicht so gut -->
<!DOCTYPE main [
<!-- ELEMENT-Zeilen können in beliebiger Reihenfolge stehen -->
<!ELEMENT main (node1,node2?,node3?)+>
<!-- + steht für ein oder mehrere -->
<!ELEMENT node1 (label?,position?)>
<!ELEMENT node2 (label?,position?)>
<!ELEMENT node3 (label?,position?)>
<!-- ? steht für optional, Reihenfolge muß exakt eingehalten werden
(tag1?,tag2?,...)+ steht für beliebig -->
<!ELEMENT label (#PCDATA)>
<!-- #PCDATA = parced character data = belebige Zeichenkette -->
<!ELEMENT position (#PCDATA)>
]>
<main>
<node1>
<label>Test1</label>
<position>1.1</position>
</node1>
<node1>
<label>Test2</label>
<position>1.2</position>
</node1>
<node2>
<label>Test3</label>
<position>1.2.1</position>
</node2>
<node3>
<label>Test4</label>
<position>1.2.1.1</position>
</node3>
<node1>
<label>Test5</label>
<position>1.3</position>
</node1>
<!-- usw.-->
</main>
mfg
Das Schmunzelmonster