Avatar billede mik789 Nybegynder
11. april 2004 - 20:41 Der 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>&#8220;</xsl:text> og <xsl:text>&#8221;</xsl:text>

der er hhv. venstre og højre dobbelt anførselstegn (altså svarende til &ldquo; og &rdquo; 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:

<head>
<title>Bibliografi</title>
<meta ...

//mik
Avatar billede mik789 Nybegynder
12. april 2004 - 10:02 #1
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 "&ldquo;" eller nummeriske som "&#8220;" eller "&#x201C;"). 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>&#38;#8220;</xsl:text> (hvor &#38; jo bare er tegnet "&").
Avatar billede mik789 Nybegynder
12. april 2004 - 10:15 #2
- 1) - det kunne man ikke :-(
hvis jeg skriver <xsl:text>&#38;#8220;</xsl:text> bliver outputtet: "&amp;#8220;"
Avatar billede 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[&#8220;]]></xsl:text>
  B: <xsl:text disable-output-escaping="yes"><![CDATA[&#8220;]]></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).
Avatar billede mik789 Nybegynder
13. april 2004 - 08:02 #4
greystate>

1) A dur ikke, men skriver &amp;#8220; - men B dur og skriver det korrekt!

2) Thx, det var det der skulle til.

tak for hjælp!
//mik
Avatar billede mik789 Nybegynder
13. april 2004 - 08:10 #5
hey, der er lige en stump problem tilbage...
Det med <xsl:text disable-output-escaping="yes"><![CDATA[&#8220;]]></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[&#x101;]]></xsl:text> - hvilket gerne skulle skrive hex koden for et a med en streg over (a macron).
Avatar billede mik789 Nybegynder
13. april 2004 - 08:19 #6
- det kræver så at jeg retter min xsd så den accepterer <xsl:text> i den tag der indeholder informationen i min xml.
Avatar billede mik789 Nybegynder
13. april 2004 - 08:34 #7
eller kan man både have en xsd og supplere med en DTD (som så kun bruges til at definere entities)?
Avatar billede 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.:

<entity ref="#8220" />
<entity name="ldquo" />
<entity ref="#x201C" />

/CS
Avatar billede mik789 Nybegynder
13. april 2004 - 10:41 #9
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[&#8220;]]>En titel med ikke-iso-8859-1-specialtegn<![CDATA[&#8221;]]></titel> ?
Avatar billede mik789 Nybegynder
13. april 2004 - 10:48 #10
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....
Avatar billede 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:

<xsl:template match="title/text() | andet-element/text() | osv..">
  <xsl:value-of disable-output-escaping="yes" select="." />
</xsl:template>

-og så bruger du ellers bare <xsl:apply-templates /> så meget som muligt...

/CS
Avatar billede mik789 Nybegynder
13. april 2004 - 11:50 #12
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.
Avatar billede Slettet bruger
13. april 2004 - 12:08 #13
Avatar billede mik789 Nybegynder
13. april 2004 - 13:11 #14
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:

<xsl:template match="category">
<p><b><xsl:value-of select="heading"/></b></p>

bliver til:

<p xmlns="">

Når de skrives sådan fungerer de ikke i Mozilla og Netscape.
Avatar billede mik789 Nybegynder
13. april 2004 - 13:12 #15
ps til sidste kommentar: Dette er fælles for XML Spy og MSXML.exe
Avatar billede Slettet bruger
13. april 2004 - 15:06 #16
Hvordan ser dit namespace setup ud? (Har du et link til XML/XSLT/XSD evt.)?

Der er flere steder den kan være gal her - namespaces skal så at sige sync'es... :-)

/CS
Avatar billede mik789 Nybegynder
13. april 2004 - 15:45 #17
ja, det er det med namespaces, som jeg ikke har sat mig ordentlig ind i...

men jeg fandt et par forum mails fra folk med lignende problemer og fandt ud af at det skyldes at jeg havde flg.:

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">

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.
Avatar billede 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
Avatar billede mik789 Nybegynder
13. april 2004 - 17:11 #19
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
Avatar billede mik789 Nybegynder
13. april 2004 - 17:12 #20
greystate> tjek lige http://www.eksperten.dk/spm/488799
Avatar billede mik789 Nybegynder
13. april 2004 - 17:18 #21
og lige en lille hale...

"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.
Avatar billede 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?" :)

Tak for bonus'en!

/CS
Avatar billede mik789 Nybegynder
13. april 2004 - 21:07 #23
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester