11. april 2004 - 20:41Der er
22 kommentarer og 1 løsning
XMLSpy problemer
To sp.:
1) Når jeg bruger F10 (XSL Transformation) opfattes mine (korrekte) specialtegn forkert. F.eks. har jeg i min xml:
<xsl:text>“</xsl:text> og <xsl:text>”</xsl:text>
der er hhv. venstre og højre dobbelt anførselstegn (altså svarende til “ og ” i html). Begge (og andre) repræsenteres i output.html bare som _ (underscore). Hvordan får jeg XMLSpy til at repræsentere specialtegn korrekt i transformationen?
2) Hvordan styrer jeg linjeskift i output.html? Den skriver mine tags i én linje derudaf, f.eks.: <head><title>Bibliografi</title><meta ... osv. Jeg vil godt have det til at se ordentligt ud:
mht 1) har jeg fået indkredset problemet: XMLSpy transformerer kun indenfor den angivne encoding. Hvis jeg angiver iso-8859-1 som encoding, vil alle tegn der er uden for dette charset ikke blive repræsenteret korrekt i output.html. At iso-8859-1 jo kun indeholder et begrænset sæt karakterer, se: http://www.cs.tut.fi/~jkorpela/latin1/1.html, er ikke noget problem i html, hvor tegn uden for dette charset jo bare kan angives med html-entities (sproglige som "“" eller nummeriske som "“" eller "“"). Der findes faktisk også et iso-10646 charset som indeholder hele baduljen (hele 8859 familien samt alle udvidelser osv., se: http://www.cs.tut.fi/~jkorpela/ucs.html8), men denne er endnu ikke understøttet af XMLSpy. Hvis man anvender DTD, kan man så bare definere nogle entities der, men jeg bruger ikke DTD, men schema, og hvad gør man så? Måske kan man snyde sådan: <xsl:text>&#8220;</xsl:text> (hvor & jo bare er tegnet "&").
- 1) - det kunne man ikke :-( hvis jeg skriver <xsl:text>&#8220;</xsl:text> bliver outputtet: "&#8220;"
Synes godt om
Slettet bruger
12. april 2004 - 20:24#3
1) Hvad sker der hvis du laver dine text tags vha. nedenstående A eller B? A: <xsl:text><![CDATA[“]]></xsl:text> B: <xsl:text disable-output-escaping="yes"><![CDATA[“]]></xsl:text>
2) Whitespace i outputtet er afhængigt af XSLT processoren - du kan i stylesheet'ets <xsl:output> tilføje attributten "indent" (indent="yes"), hvilket i MSXML bevirker at der indsættes linjeskift (men ikke tabs).
hey, der er lige en stump problem tilbage... Det med <xsl:text disable-output-escaping="yes"><![CDATA[“]]></xsl:text> er jo en del af min xsl. Men hvad med mine specialtegn i xml'en? Der kan jeg jo ikke uden videre bruge <xsl:text> osv., eller skal jeg f.eks. gøre sådan i min xml:
<xsl:text xmlns:xsl="http://www.w3.org/1999/XSL/Transform" disable-output-escaping="yes"><![CDATA[ā]]></xsl:text> - hvilket gerne skulle skrive hex koden for et a med en streg over (a macron).
eller kan man både have en xsd og supplere med en DTD (som så kun bruges til at definere entities)?
Synes godt om
Slettet bruger
13. april 2004 - 09:58#8
Hvis bare du wrapper dine specialtegn i en CDATA Section, altså dén der fætter: <![CDATA[...]]>, så skulle du kunne slippe om ved det. (Men husk at dit XSLT skal vide hvor de forekommer, så du kan slå "disable-output-escaping" fra - virker også i <xsl:value-of />)
Alternativt kunne du jo vælge at tilføje et enket tag til din XML, der tillod dig at indsætte entities - f.eks.:
greaystate> tak fordi du gider at fortsætte med disse sidste sp. - er det ok at vi ordner point (30 ekstra) bagefter? - ellers skulle jeg oprette et nyt sp. for den sidste del her.
Du siger: "Men husk at dit XSLT skal vide hvor de forekommer, så du kan slå "disable-output-escaping" fra" - Betyder det at jeg i min XSD skal definere de elementer i min XML, der kan indeholder specialtegn, som komplekse typer der kan indeholde en <![CDATA[...]]>? Hvordan gør jeg det, f.eks. hvis vi taler om et element i min XML, f.eks. "<titel>", der indeholder tekst hvoraf enkelte tegn skal pakkes i en CDATA fætter? Hvordan skulle denne type defineres i min XSD?
Og hvis denne type er defineret kan jeg så bare sige:
<titel disable-output-escaping="yes"><![CDATA[“]]>En titel med ikke-iso-8859-1-specialtegn<![CDATA[”]]></titel> ?
egentlig forstår jeg heller ikke hvorfor dette i det hele taget er et problem. XML filer forstår jo udmærket alle tegnkoder når bare de er skrevet som decimal- eller hex-koder. Så det er bare XML Spy der ikke lader dem være når den transformerer, men erstatter alle dem der falder uden for den angivne encoding med en dum underscore. Ikke særlig smart....
Synes godt om
Slettet bruger
13. april 2004 - 11:35#11
Alt OK - er ikke point-hungrende :-)
Vi kan hurtigt blive enige om at problemet er XMLSpy, og ikke andet - men nu er det jo det du bruger, så derfor må du jo lave en workaround - med mindre du kan leve med at preview i XMLSpy ikke opfører sig korrekt. Det opfører sig vel korrekt i "production" (på webserveren), ikke?
Du skal ikke lave dit Schema om - CDATA er det samme som text() - men parses ikke af parseren. Men du skal i dit stylesheet lave en template for text() nodes der indeholder disse tegn:
hvis det bare var et sp. om preview, kunne det være ligemeget - jeg kan altid lægge det på serveren først - men problemet er netop at de servere, jeg ligger på ikke uden videre kan gøre det, se sp. http://www.eksperten.dk/spm/488176 så derfor ville jeg lave transforationen med XML Spy og så lægge den ind i stedet.
greystate> wouw, det var et godt link - har allerede transformeret uden problemer med mine spec.char. Kun ét problem tilbage: hvordan undgår jeg at alle mine <p> tags i f.eks:
i starten af min xsl. Hvis jeg så flytter dette: xmlns="http://www.w3.org/1999/xhtml" fra <html> tag'et (hvor man jo ønsker det i sin output), og i stedet flytter det op i <xsl:stylesheet> tag'et, så fungerer det hele, og i outputtet flyttes det automatisk ned i <html> tag'et. Jeg har ikke helt forstået hvorfor det opfører sig sådan, men det virker.
Det smarte er så, at i denne form kan både IE6, Netscape7 og Mozilla Firefox åbne xml-filen direkte (dvs. disse browsere har en egen xml processor der fungerer), så egentlig er det nu kun af hensyn til ældre browsere at jeg børe lægge den transformerede xhtml-fil ind i stedet.
Synes godt om
Slettet bruger
13. april 2004 - 16:49#18
Nåmen så må jeg jo hellere prøve at forklare hvorfor :-)
** Et namespace gælder for det element det defineres i, og tilhørende "children".
Dvs.: Når du sætter det pågældende NS inde i din template, gælder det kun herinde, og KUN for <html> (og "children" hertil).
Når du flytter det op i <stylesheet> elementet er det gyldigt i hele dokumentet, da dette jo er rod-elementet.
XSLT processoren indsætter så selv de namespaces der er blevet brugt i XML + XSLT, i resultatet... /CS
ok... ja, det lyder da meget enkelt. Jeg synes godt nok jeg har fjumret med de der namespeces mange gange uden rigtig at kunne få det til at gå op. Nu har jeg http://www.w3.org/TR/REC-xml-names/ liggende til behagelig gonat-læsning, så måske i aften...?igen mange tak for hjælpen
"Når du sætter det pågældende NS inde i din template, gælder det kun herinde, og KUN for <html> (og "children" hertil)."
Ja, det er jo det der snyder, for man tror så netop at ved at sætte det i <html> at man så også har sat det i <p> der er barn af html. Men som jeg forstår dig, så gælder det ikke i xsl'en hvor <html> er barn, ikke af xsl'ens rodelement, men af xml'ens, og <p> er barn af <item> i mit tilfælde. Så man skal tænke xsl'en som sit eget dokument.
Synes godt om
Slettet bruger
13. april 2004 - 20:00#22
Ja - lige netop - når man er kommet til den "AHA", hvor det går op for een at et XSLT stylesheet "bare" er et XML dokument, så sker der ting og sager inde i ens egen processor (hjernen, red.) - for på det tidspunkt hvor man i en template [tror man] benytter sig af en namespace-deklaration, ER den allerede blevet parset af XML parseren, og "oversat" til f.eks. nogle XMLDOM nodes ... bla .. bla . bla.. "hov, er der nogen der lytter?" :)
ingen årsag... jeg får jo nok brug for dig en anden gang. Sagen er den at jeg nok er blevet lidt hooked på det her. XML sprogene er ret fedt at arbejde med hvis man interesserer sig for sprog og information "i sig selv". I XML er man nødt til selv at tænke sit dokument igennem helt fra bunden og hele vejen rundt. //mik
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.