XSLT - Problem

mne

Grünschnabel
Hallo allseits,

ich bin bereits ziemlich verzweifelt wegen XSLT ... dazu muss ich sagen, dass ich keine Erfahrung darin habe, und mich nebenbei durch die Tutorials auf w3schools durchkaempfe, aber dennoch nicht weiterkomme ,,,

Konkret hab ich ein XML welches wie folgt aufgebaut ist (Nur auszugsweise) :
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model docowner="bla" footertext="blubb" name="Name">
    <atts>
        <att requestby="" length="12" type="numeric" name="partnerid" />
        <att requestby="" length="8" type="date" name="date" />
    </atts>
    <sources>
        <source home="SOURCENAME1" name="Name1" />
        <source home="SOURCENAME2" name="Name2" />
        <source home="SOURCENAME3" name="Name3" />
    </sources>
</model>

Rausbekommen will ich ein Textfile, in dem untereinander alle "home"-Attribute stehen, also
===
SOURCENAME1
SOURCENAME2
SOURCENAME3
===
sonst nichts.

Nach langem rumspielen mit dem XSL sah es im vorletzten Versuch so aus:
Code:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" indent="no" />
<xsl:template match="/">
	<xsl:for-each select="model/sources/source">
		TEST				
		<xsl:value-of select="@home" />
	</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Die Ausgabe nach der Transformation sah eigentlich schon ganz gut aus, und zwar so:
Code:
		TEST				
		SOURCENAME1
		TEST				
		SOURCENAME2
		TEST				
		SOURCENAME3

Also hab ich im nächsten Testlauf das überflüssige "TEST" aus obigem XSL entfernt, das sieht dann also so aus:
Code:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" indent="no" />
<xsl:template match="/">
	<xsl:for-each select="model/sources/source">
		<xsl:value-of select="@home" />
	</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Danach sieht die Ausgabe plötzlich so aus:
Code:
SOURCENAME1SOURCENAME2SOURCENAME3

*seufz* :)

Irgendwie schaffe ich es nicht, dass mir hier wirklich Zeile für Zeile ausgegeben wird. Ach ja, alle Versuche den Pfad gleich beim "template match" anzugeben, scheiterten auch. Da hatte ich dann unzählige Versuche wie "<xsl:template match="model/sources/source">, aber da hat er dann entweder gar nichts, oder überhaupt "Mist" ausgegeben. Aber das nur nebenbei.

Könnte mir da bitte jemand weiterhelfen bzw. auf die Sprünge helfen, was ich da falsch mache? Danke!

LG., mne
 

hela

Premium-User
Hallo,
versuch es mal damit:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" />

<xsl:template match="/model/sources">
	<xsl:text>===
</xsl:text>
		<xsl:apply-templates />
	<xsl:text>===</xsl:text>
</xsl:template>

<xsl:template match="source">
	<xsl:value-of select="concat(@home,'
')" />
</xsl:template>

</xsl:stylesheet>
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: mne

mne

Grünschnabel
Hallo hela,

zuerstmal herzlichen Dank für Deine Antwort!

Das Ergebnis sieht "ganz gut" aus, ist aber leider noch nicht ganz so wie ich's brauche ... ich habe Dein XSL ganz leicht abgeändert, da ich die führende und die abschliessendes Zeile mit den "===" nicht brauche. War vielleicht in meinem ersten Post nicht ganz klar formuliert, die Ausgabe sollte exakt so aussehen:

Code:
SOURCENAME1
SOURCENAME2
SOURCENAME3

Ich hab also in Deinem XSL die entsprechenden Anweisungen rausgenommen:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
<xsl:output method="text" />
 
<xsl:template match="/model/sources">
	<xsl:apply-templates />
</xsl:template>
 
<xsl:template match="source">
	<xsl:value-of select="concat(@home,'
')" />
</xsl:template>
 
</xsl:stylesheet>

Das produziert folgendes Ergebnis:
Code:
\t
\t\t
\t\t
\t
\t
\t\tSOURCENAME1

\t\tSOURCENAME2

\t\tSOURCENAME3

\t

( Die "\t" hab ich zum verdeutlichen händisch reingeschrieben, an diesen Stellen befinden sich jeweils Tabulatoren )

Ohne den Tabulatoren und ohne den Leerzeilen wäre es also perfekt.

Ich bin schon knapp davor, mir noch 'n kleines Perl-Script zu schreiben, welches mir obige Ausgabe "geradebiegt" ... aber ich denk mir auch, das gibt's doch nicht, daß XSLT bei einer eigentlich so simplen Aufgabe versagt ... :)

LG., mne
 
Zuletzt bearbeitet von einem Moderator:

hela

Premium-User
Ohne den Tabulatoren und ohne den Leerzeilen wäre es also perfekt.
Vermutlich werden die Tabulatoren durch die Default-Template-Regeln ausgegeben:
XML:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" />
 
<xsl:template match="/model/sources/source">
	<xsl:value-of select="concat(@home,'
')" />
</xsl:template>

<xsl:template match="text()" />

</xsl:stylesheet>
Ich bin schon knapp davor, mir noch 'n kleines Perl-Script zu schreiben, welches mir obige Ausgabe "geradebiegt" ...
Klar, mach das - wenn du damit besser zurecht kommst.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: mne