|
|
|
und ein weiteres kleines Problem...
|
Moin.
Im Rahmen einer Projektarbeit bastel ich mit Kommilitonen an einer HTML-Ausgabe von XML-Daten eines Wörterbuchs.
Ein Problem, für das wir bisher keine gute Lösung haben ist, dass in diesen XML-Daten (die eine grauenhafte Struktur haben), die Beispielsätze zu den einzelnen Lemmata manchmal nicht durch Tags getrennt sind, sondern jeweils durch ein Semikolon. Mit substring-before und substring-after könnte man das natürlich trennen, aber leider ist uns bisher kein geeignetes "Schleifen"-Konstrukt eingefallen, mit dem diese Trennung ausreichend oft durchgeführt wird, da es eben auch vorkommt, dass z.b. 3 Beispielsätze in einem Tag sind.
Dann noch ein weiteres (wahrscheinlich ziemlich einfaches) Problem:
Es gibt einen Tag namens "commBr", der für "Kommentar in Klammern" steht. Das ganze sieht dann z.B. so aus:
|
Code: |
<q> Blablablalbablalabl <commBr>xyz</commBr> blablablablabla </q>
|
|
Die Ausgabe dazu soll dann sein: Blablablablabla (xyz) blablablabla
Unser Problem (wir sind ziemliche XSLT-Anfänger ) war, dass einmal der eigentliche Text (per value-of) ausgegeben wurde und dahinter per apply-templates der Text in Klammern kam, so dass manches eben doppelt war. Bei der Benutzung von text() kam nichts doppelt vor, aber es wurde nur der Text bis zum ersten commBr-Tag ausgegeben.
Bei dem Problem ist die Lösung bestimmt ziemlich einfach und wir sind nur noch nicht draufgekommen. Aber jede Hilfe wär nett.
|
|
|
|
|
|
|
könntest du evtl. mal ein beispiel liefern, wie so ein kompletter node samt all deinen "problem inhalten" aussieht?
|
|
|
|
|
|
|
|
Code: |
<div0 type="letter" n="A">
<entry>
<form>
<orth>Aal</orth>
</form>
[...]
<eg type="phrase">
<q> glatt wie ein A. sein <commBr>aalglatt sein</commBr>; sich winden wie ein A. <commBr>versuchen, einer unangenehmen Situation geschickt zu entgehen</commBr></q>
</eg>
</entry>
</div0>
|
|
Sachen innerhalb von commBr sollen eben in Klammern stehen und bei den Semikolons wollen wir entweder ein <br /> einfügen oder ein Listenelement draus machen o.ä.
|
|
|
|
|
|
|
Das kann doch nicht der sinn von XML sein :x
|
|
|
|
|
|
|
Was kann nicht der Sinn von XML sein?
|
|
|
|
|
|
|
dass die endformatierung durch die daten vorgegeben wird. das commBr find ich echt eklig. über den rest kann man ja ein explode drüberlaufen lassen.
|
|
|
|
|
|
|
Diskutiert doch jetzt nicht über die blöde vorgabe der XML-Struktur, auch wenn sie tatsächlich keinen Sinn macht.
| Zitat von [FGS]E-RaZoR
Sachen innerhalb von commBr sollen eben in Klammern stehen und bei den Semikolons wollen wir entweder ein <br /> einfügen oder ein Listenelement draus machen o.ä.
| |
Wenn es darum geht alle ; durch <br/> zu ersetzen, kann man ja einfach nen substring verwenden. Bei Listen wird es schon wieder komplizierter, da man ja Anfangs- und Endtag hat.
Vielleicht könnt ihr ja erstmal ein Meta-Format erstellen. Also ihr verfahrt in mehreren Schritten. Einmal eine Transformation in der ihr das XML-Format das ihr bekommt 'übersetzt' in eine XML-Struktur, die euch besser liegt und die ihr dann nutzen könnt um das HTML zu erzeugen. Vielleicht so als Idee. In diesem Zusammenhang bietet sich vlt. das Ant-Tool von Apache an (ant.apache.org), das ist für sowas eine Ideale Sache (ich weiß jetzt nicht, in wie fern ihr da bisher irgendwelche Software verwendet, die dann letztlich die XSL-Transformation nach HTML vollzieht). Zum Entwickeln von Ant-Scripts eignet sich Eclipse, die haben einen Editor für Ant (built-in), sowie eine Integration in die Launch-konfiguration. Für eclipse selbst gibt es da noch das eclipseXSLT Plugin. Mit dem man XSLT entwickeln kann und XPATH Statements direkt auf das zugrundelegende XML schicken kann. Müsst halt mal schauen, ob ihr euch da einarbeiten könnt, ist jetzt nur nen Vorschlag, da das eigentlich eine Ideale Umgebung ist.
Wenn ihr aber - mal wieder zurück zu dem XSL-Problem von oben - Inhalt an einem Semikolon splitten müsst. Dann gibt es in XSL das Rekursion Design-Pattern. Damit lässt sich sowas erledigen. Mit diesem Pattern lässt sich ein Rekursives Schleifenkonstrukt nachbauen - ein anderes kenn ich auch nicht.
XSL ist sone Sache. Man muss halt wissen, wierum man arbeiten möchte. Also XML gibt die Vorgabe und man arbeitet mit apply-templates (gibt auch nen Namen für dieses Design-Pattern). Dann gibt es die Arbeitsweise, dass das XSL die Struktur übernimmt, mit call-template (Das ist mehr so die Funktionen-Programmierung, wie man es vlt. in JS/php machen täte). Man muss in XSL halt mal um die Ecke denken, nicht zu knapp.
Erm ja, soll ersma genügen
Ride On
gossi
|
|
|
|
|
|
|
| Zitat von rABBI
dass die endformatierung durch die daten vorgegeben wird. das commBr find ich echt eklig. über den rest kann man ja ein explode drüberlaufen lassen.
| |
Das ist uns wohl bewusst, es existiert auch schon eine neue DTD, die wesentlich mehr Sinn ergibt, aber bis die XML-Daten daran angepasst sind, dauert es noch ne ganze Zeit, da der Arbeitsbereich selber im Moment dafür keine Kapazitäten hat und wir im Endeffekt als Erstsemester mit nem 2 SWS Seminar über Text-Technologie (Zeichencodierung, XML und ganze 3 Std. XSL ) dadrauf angesetzt werden.
Wir haben Homesite für den HTML/CSS-Prototyp benutzt und Kate/Ultraedit fürs eigentliche Coden .. die Transformation erledigt Xalan per Kommandozeile
Ich gucke mir die anderen Sachen mal an, denke aber, dass das für die Projektarbeit (die im Endeffekt ein 2 SWS-Seminar ersetzen soll, also theoretisch ~ 30 Std) etwas überdimensioniert ist.
Ich denke, dass wir das dann einfach mit dem Substring machen, eigentlich eine gute Idee.
Wie soll das eigentlich funktionieren? Mit Substring an sich kann ich doch nur "Teilstrings" aus nem String rausholen, oder nicht?
|
|
|
|
|
|
|
Also, wir kommen insgesamt gut vorran, für das Semikolon-Problem benutzen wir einfach n search-and-replace-Dingens, was die ; durch <br /> ersetzt.
Nur das commBr macht Probleme.
Also aus <q>123 </commBr>xyz</commBr> 456</q> soll die Ausgabe 123 (xyz) 456 erfolgen .. eigentlich müsste das ja total einfach sein, nur kommen wir nicht drauf. Kann da jemand helfen?
Und mich nervt es ja schon ein wenig, dass bei XalanTransform an den Uni-Rechnern was sinnvolles rauskommt, bei mir lokal aber jegliches HTML scheinbar ignoriert wird. Nu muss ich da wieder mit Putty drauf. Und Xalan-J ist für Nicht-Nerds völlig .. ääh .. naja. Frustrierend.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von [FGS]E-RaZoR am 28.02.2007 21:03]
|
|
|
|
|
|
Naja, ich kenne mich mit XSLT nicht wirklich aus. Aber im Zweifelsfall könnte man doch auch wieder mit dem search-and-replace den öffnenden und den schliesenden Tag von commBr jeweils durch die jweilige Klammer ersetzen.
Aber das stinkt mehr nach einem schmutzigen Trick, als nach valider Transformation
|
|
|
|
|
|
|
Haha, stimmt, gute Idee
Und ich bin auch mal n Depp .. beschwere mich über XalanTransform, dabei hab ich nur die Argumente vertauscht, er wollte die XML-Datei auf die XSL-Datei werfen .. aber anstatt mir n Fehler zurückzugeben ..
|
|
|
|
|
|
|
Weiter gehts mit Problemen:
Ich hab mir die substition-Funktion von http://xsltsl.sourceforge.net/string.html genommen und lasse das dann drüberlaufen .. funktioniert an sich auch, nur kann ich eben keine Tags darein packen. Wenn ich sage, er soll ; durch "xyz" ersetzen, dann klappt alles. Aber wenn ich sage, er soll ; durch "<br />" ersetzen, dann nicht. Es erscheint einfach garnichts dann. Wenn ich <xsl:text> <br /> </xsl:test> mache, dann sagt er mir, dass da kein br-Tag sein darf.
<xsl:element name="br /> klappt auch nicht.
Ah, output-escapen ausstellen und dann einfach < und so. Fein.
Nu hab ich es sogar als Listen-Elemente. Einfach ein öffnendes li davor, bei jedem Semikolon li zumachen und neu aufmachen und am Ende nochma zumachen .. schon ziemlich logisch, eigentlich
|
[Dieser Beitrag wurde 3 mal editiert; zum letzten Mal von [FGS]E-RaZoR am 28.02.2007 22:31]
|
|
|
|
|
|
Ich glaub, irgendwas machst du anders, als gedacht Aber wenns funktioniert, will ich da mal nicht dran rummeckern.
Z.B. bedeutet <xsl:text /> , dass da drin kein Xml-Element steht, sonder nur Text Aber dein Problem ist tatsächlich, dass diese Formatierung mit ";" für Xml völlig falsch ist, da dieses genau dafür gedacht wäre, es in Elemente zu packen
|
|
|
|
|
|
|
Wie wäre es so:
|
Code: |
<xsl:template match="q">
<xsl:applay-templates/>
</xsl:template>
<xsl:template match="commBr">
(<xsl:value-of select="."/>)
</xsl:template>
|
|
Ungetestet...
Ansonsten schau mal, ob der Xalan Exslt-Support hat: www.exslt.org
Da sind halt schon ganz gute Funktionen bei, musst wohl aber nen Namespace dafür definieren und die Funktion damit aufrufen -> exlst:function('doIt - oh Yeah!'), wenn ich mich da nicht täusche...
|
|
|
|
|
|
|
| Zitat von [DK]Peacemaker
Ich glaub, irgendwas machst du anders, als gedacht Aber wenns funktioniert, will ich da mal nicht dran rummeckern.
Z.B. bedeutet <xsl:text /> , dass da drin kein Xml-Element steht, sonder nur Text Aber dein Problem ist tatsächlich, dass diese Formatierung mit ";" für Xml völlig falsch ist, da dieses genau dafür gedacht wäre, es in Elemente zu packen
| |
Ja, das mit xsl:text war nur ein verzweifelter Versuch
Lag halt an dem Escaping ..
Und eben dieses Problem müssen wir ja irgendwie lösen.
Danke Unitrialer .. ich habs jetzt so gemacht, dass ich eine Variable einführe .. und zwar ist das der Text mit Apply-Templates drauf, damit die ebenzu Klammern umgewandelt werden (das hatten wir vorher schon) und auf der Variable lass ich dann Search&Replace laufen .. klappt wunderbar
|
|
|
|
|
|
|
Ich hijacke mal:
|
Code: |
<xsl:for-each select="knoten1">
paar Ausgaben
<xsl:for-each select="Knoten2">
<xsl:choose>
<xsl:when test="@value = Unterknoten von Knoten1">
<xsl:value-of select="."/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
|
|
Wie komme ich an die Unterknoten von der ersten for-each?
Da ich ja in der 2. stecke kann ich ja mit xPath nicht mehr drauf zugreifen. Oder geht das irgendwie?
Also "Unterknoten von Knoten1" müssen abgefragt werden.
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Gori am 08.05.2007 20:11]
|
|
|
|
|
|
Ist kompliziert, zeig mal was an Quell-XML, was transformiert werden soll. Als Tipp (vielleicht hilfts ja), du kannst mit dem []-Operator auch Eigenschaften von Unterknoten als Referenz angeben.
Beispiel
...select="//Veranstaltung[Veranstaltungsnummer=14]/Terminart"
|
|
|
|
|
|
|
| Zitat von [DK]Peacemaker
Ist kompliziert, zeig mal was an Quell-XML, was transformiert werden soll. Als Tipp (vielleicht hilfts ja), du kannst mit dem []-Operator auch Eigenschaften von Unterknoten als Referenz angeben.
Beispiel
...select="//Veranstaltung[Veranstaltungsnummer=14]/Terminart"
| |
Die Nummer müsste ich wenn als Variable speichern, habs jetzt erstmal so:
|
Code: |
<xsl:for-each select="Knoten">
<xsl:variable name="field_6" select="field_6"/>
<xsl:for-each select="/project/todo/language/listings/todo/priorities/priority">
<xsl:choose>
<xsl:when test="@value = $field_6">
<xsl:value-of select="."/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
|
|
Funzt, aber bin nicht sooo glücklich mit dem workaround
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Gori am 08.05.2007 22:09]
|
|
|
|
|
|
Ich bin jetzt mehr der Meinung, dass ein einfaches "../" sogar funktionieren müsste.
|
|
|
|
|
|
|
Dann würd ich doch wegen der inneren for-each in /project/todo/language/listings/todo/priorities/
landen, da will ich ja nicht hin.
Ich will ja zu /project/todo[1]/content[1]/record[1]/field_6 oder record[2]/field_6 oder record[3]/field_6...
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Gori am 09.05.2007 13:51]
|
|
|
|
|
|
Hier stand nichts.
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Gori am 13.05.2007 11:22]
|
|
|
|
|
Thema: XSLT: String so oft wie nötig an ";" trennen ( und ein weiteres kleines Problem... ) |