Nodes über ein Attribut zusammenfassen
bernd
- xsl
0 Thomas J.S.0 bernd
Hallo,
kleine Aufgabe, großes Problem (für mich). Aus einer XML-Datei soll via XSL ein
HTML-Dokument mit einer Tabelle erzeugt werden. Das ganze geschieht in einer
ASP-Seite, was aber nicht von Bedeutung ist. Die Daten (XML) kommen aus einer
Datenbank, sprich werden über ein ADODB.Recordset in das XML-Dokument geschrieben.
Soll bedeuten, dass ich das Ausgabeformat der XML-Datei nicht beeinflussen kann nur
die XSL-Datei kann ich ändern.
Ich habe diese XML-Datei mal bereinigt und als test.xml abgespeichert (siehe unten).
Jetzt das Problem, die Daten liegen so vor, dass zusammengehörige "Datensätze"
über ein Attribut (parentid) bestimmt werden können.
Mein Gedanke ist, die book-Nodes so zu selektieren, dass ich eine Art Set/Collection bekomme.
Leider weiss ich nicht wie ich das bewerkstelligen soll.
Gibt es eine Möglichkeit die book-Nodes mit gleicher parentid irgendwie zusammenzufassen,
so dass ich diese tabellarisch darstellen kann?
<%@ LANGUAGE = JScript%>
<%
var xml = Server.CreateObject("Msxml2.DOMDocument");
var xsl = Server.CreateObject("Msxml2.DOMDocument");
xml.load(Server.MapPath("test.xml"));
xsl.load(Server.MapPath("style.xsl"));
xml.transformNodeToObject(xsl, Response);
%>
<?xml version="1.0"?>
<catalog>
<book id="1" parentid="100" attr="titel" wert="Inside COM+"/>
<book id="2" parentid="100" attr="isbn" wert="3-86063-498-4"/>
<book id="3" parentid="100" attr="verlag" wert="Microsoft Press"/>
<book id="4" parentid="101" attr="titel" wert="COM"/>
<book id="5" parentid="101" attr="isbn" wert="3-8273-1385-6"/>
<book id="6" parentid="101" attr="verlag" wert="ADDISON-WESLEY"/>
</catalog>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head>
<title>Test</title>
</head>
<body>
<xsl:for-each select="catalog/book">
<xsl:value-of select="@attr"/> / <xsl:value-of select="@wert"/><br/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
+-----------------------------------------------+
|titel |verlag |isbm |
+--------------+-----------------+--------------+
|Inside COM+ |Microsoft Press |3-86063-498-4 |
|COM |ADDISON-WESLEY |3-8273-1385-6 |
+--------------+-----------------+--------------+
Danke
bernd
Hallo,
kleine Aufgabe, großes Problem (für mich).
Jetzt das Problem, die Daten liegen so vor, dass zusammengehörige "Datensätze" über ein Attribut (parentid) bestimmt werden können.Mein Gedanke ist, die book-Nodes so zu selektieren, dass ich eine Art Set/Collection bekomme.
Leider weiss ich nicht wie ich das bewerkstelligen soll.
Gibt es eine Möglichkeit die book-Nodes mit gleicher parentid irgendwie zusammenzufassen, so dass ich diese tabellarisch darstellen kann?
Eine fast identische Frage habe ich heute weiter unten beantwortet: [pref:t=79788&m=462537]
Wenn du noch fragen hast, kannst du sie dann hier stellen.
Grüße
Thomas
Hallo,
so, jetzt hast Du mich ganz schön ins schwitzen gebracht;)
Aber immerhin habe ich jetzt eine Lösung erarbeitet, frage mich
aber, ob's nicht vielleicht einfacher ginge bzw. ob das so der
richtige Weg ist.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="mykey" match="book" use="@parentid"/>
<xsl:template match="/">
<html>
<head>
<title>Test</title>
</head>
<body>
<table border="1">
<tr>
<th>Titel</th>
<th>Verlag</th>
<th>ISBN</th>
</tr>
<xsl:variable name="myvar" select="catalog/book[generate-id() = generate-id(key('mykey', @parentid))]"/>
<xsl:for-each select="$myvar">
<tr>
<td><xsl:value-of select="key('mykey', @parentid)[@attr = 'titel']/@wert"/></td>
<td><xsl:value-of select="key('mykey', @parentid)[@attr = 'verlag']/@wert"/></td>
<td><xsl:value-of select="key('mykey', @parentid)[@attr = 'isbn']/@wert"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Nochmals vielen Dank, hast mir sehr geholfen
bernd
Hallo,
so, jetzt hast Du mich ganz schön ins schwitzen gebracht;)
;-)
Aber immerhin habe ich jetzt eine Lösung erarbeitet,
Darum ging's ja ;-)
frage mich aber, ob's nicht vielleicht einfacher ginge bzw. ob das so der richtige Weg ist.
Das Problem ist, dass du eine zweite Gruppierung brauchen würdest, aber für diese zweite Gruppierung kein wirklicher vergelichbasis gibt, denn
wenn du die Reihenfolge Titel, Verlag, ISBN so erhalten willst, muss du es mehr oder weniger so machen wie du es schon gemacht hast.
Einfacher ginge es natürlich so:
<xsl:template match="book">
<xsl:variable name="myvar" select="key('mykey', @parentid)"/>
<xsl:if test="generate-id(.) = generate-id(key('mykey', @parentid)[1])">
<tr>
<xsl:for-each select="$myvar">
<td><xsl:value-of select="@wert"/></td>
</xsl:for-each>
</tr>
</xsl:if>
</xsl:template>
Aber wie gesagt, für die zweite Sortierung, kannst da du wenig in XSL tun, denn weder die Sortierung des @attr-Attributs nach ABC, oder nach 'string-length' bringt die Reihenfolge: Titel, Verlag, ISBN.
Je nachdem ob du Einflß auf das XML hast, kannst du dies dort berücksichtigen (z.B. dann die Ausgabe der Elemente immer in der Reihenfolge attr="titel", attr="verlag", attr="isbn" geschieht).
Grüße
Thomas