Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: Che Guevara


 Thema: XSLT: String so oft wie nötig an ";" trennen ( und ein weiteres kleines Problem... )
erste ungelesene Seite | letzter Beitrag 
[FGS]E-RaZoR

AUP [FGS]E-RaZoR 19.09.2011
Bitte beachten 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 Breites Grinsen) 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.
27.02.2007 12:07:10  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
White[AoT]

Arctic
könntest du evtl. mal ein beispiel liefern, wie so ein kompletter node samt all deinen "problem inhalten" aussieht?
27.02.2007 13:24:52  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[FGS]E-RaZoR

AUP [FGS]E-RaZoR 19.09.2011
 
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.ä.
27.02.2007 13:31:16  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
TriggerTG

TriggerTG
Das kann doch nicht der sinn von XML sein :x
27.02.2007 13:43:05  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[FGS]E-RaZoR

AUP [FGS]E-RaZoR 19.09.2011
Was kann nicht der Sinn von XML sein?
27.02.2007 13:51:12  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
rABBI

Arctic
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.
27.02.2007 14:05:28  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
unitrialer

Arctic
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 Breites Grinsen

Ride On
gossi
27.02.2007 14:25:38  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[FGS]E-RaZoR

AUP [FGS]E-RaZoR 19.09.2011
 
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 Breites Grinsen ) 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 peinlich/erstaunt

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? peinlich/erstaunt Mit Substring an sich kann ich doch nur "Teilstrings" aus nem String rausholen, oder nicht?
27.02.2007 14:49:16  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[FGS]E-RaZoR

AUP [FGS]E-RaZoR 19.09.2011
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]
28.02.2007 21:01:20  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
GH@NDI

ghandi2
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 Breites Grinsen
28.02.2007 21:24:55  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[FGS]E-RaZoR

AUP [FGS]E-RaZoR 19.09.2011
Haha, stimmt, gute Idee Breites Grinsen


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 .. Breites Grinsen
28.02.2007 21:29:56  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[FGS]E-RaZoR

AUP [FGS]E-RaZoR 19.09.2011
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 &lt; 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 Breites Grinsen
[Dieser Beitrag wurde 3 mal editiert; zum letzten Mal von [FGS]E-RaZoR am 28.02.2007 22:31]
28.02.2007 22:06:49  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[DK]Peacemaker

[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
28.02.2007 22:44:39  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
unitrialer

Arctic
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...
28.02.2007 22:49:37  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[FGS]E-RaZoR

AUP [FGS]E-RaZoR 19.09.2011
...
 
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 Breites Grinsen

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
28.02.2007 23:03:44  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Gori

Gori
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]
08.05.2007 20:08:39  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[DK]Peacemaker

[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"
08.05.2007 20:54:43  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Gori

Gori
 
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]
08.05.2007 22:09:17  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[DK]Peacemaker

[dk]peacemaker
Ich bin jetzt mehr der Meinung, dass ein einfaches "../" sogar funktionieren müsste.
08.05.2007 22:21:49  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Gori

Gori
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]
09.05.2007 13:49:29  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Gori

Gori
Hier stand nichts.
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Gori am 13.05.2007 11:22]
12.05.2007 22:33:59  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: XSLT: String so oft wie nötig an ";" trennen ( und ein weiteres kleines Problem... )


mods.de - Forum » Webdesign & Coding » 

Hop to:  

Thread-Tags:
| tech | impressum