Jag håller på och mixtrar lite med generering av kvitton från en XML-databas med hjälp av XSLT. För relationsuppslagning vill jag använda id()-funktionen, men jag får det bara att fungera i Internet Explorer. Har jag gjort något fel i koden, eller är det Firefox fel? Håller fortfarande på och experimenterar en hel del, visserligen, så koden är långt ifrån färdig. Jag testade filerna i FF 2.0.0.1 och det funkade fint, samma resultat som IE, Opera däremot klarade inte av det... Verkar nu ha hittat orsaken till strulet: Firefox läser inte in den externa DTD:n korrekt. När jag provar att lägga den internt i XML-filen fungerar det nämligen för båda webbläsarna. Hej David, och tack för ditt svar. Jag använder precis som du FF 2.0.0.1. Körde du med extern DTD som i mitt exempel, eller lade du in den internt? Var använder du id()-funktionen? På vilket sätt funkar det inte i Firefox? Jag ser inget fel när jag öppnar kvitton.xml. I exemplet jag visade använder jag det bara på ett ställe, när namnet på personen man blev betjänad av presenteras. Det ska stå: Jag lånar min egen tråd och ställer en fråga angående ett hyfsat relaterat problem som jag snabbt stötte på efter att jag fortsatte bygga vidare på den nämnda databasen. Jag skulle vilja använda två id()-funktioner tillsammans ("id(@vara)/id(@varugrupp)", där varugrupp är en tillagd gren i databasen; varje vara har en varugrupp). Jag får ett felmeddelande som menar att browsern vill ha en "NodeTest" där min andra id()-funktion befinner sig. Måste jag gå omvägen och först hoppa in i "vara" genom en apply-templates och sen plocka ut ett värde med hjälp av en value-of select med id(@varugrupp) som attribut? Som sagt, det funkar för mig... Kör http du via webservern så kan det vara en orsak, jag körde lokalt när jag testade. Det är lugnt, jag löste det genom att ha DTD:n lokalt istället. Stort tack för hjälpen dock! :) > Jag skulle vilja använda två id()-funktioner tillsammans ("id(@vara)/id(@varugrupp)"id()-funktionen i Firefox
Bifogar mina tre filer:
kvitto.dtd:
<code><?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT databas (butiker, varor, kvitton, momsklasser)>
<!ELEMENT butiker (butik*)>
<!ELEMENT varor (vara*)>
<!ELEMENT vara (#PCDATA)>
<!ATTLIST vara varuid ID #REQUIRED>
<!ELEMENT butik (telefonnummer+, öppettider*, kassapersonal+, adress?)>
<!ATTLIST butik butikid ID #REQUIRED
orgnr CDATA #REQUIRED
butiksnamn CDATA #REQUIRED>
<!ELEMENT öppettider (öppettid+)>
<!ELEMENT öppettid EMPTY>
<!ATTLIST öppettid veckodag CDATA #REQUIRED
öppningstid CDATA #IMPLIED
stängningstid CDATA #REQUIRED>
<!ELEMENT telefonnummer EMPTY>
<!ATTLIST telefonnummer riktnummer CDATA #REQUIRED
nummer CDATA #REQUIRED
fax CDATA #IMPLIED>
<!ELEMENT kassapersonal (namn?)>
<!ATTLIST kassapersonal anställningsnummer ID #REQUIRED>
<!ELEMENT namn EMPTY>
<!ATTLIST namn förnamn CDATA #IMPLIED
efternamnnamn CDATA #IMPLIED>
<!ELEMENT adress EMPTY>
<!ATTLIST adress gata CDATA #REQUIRED
gatunummer CDATA #REQUIRED
postnummer CDATA #REQUIRED
stad CDATA #REQUIRED
land CDATA #REQUIRED
övrigt CDATA #IMPLIED>
<!ELEMENT kvitton (kvitto*)>
<!ELEMENT kvitto (kvittorad*, betalning)>
<!ATTLIST kvitto kvittonr CDATA #IMPLIED
kvittoid ID #REQUIRED
butik-ref IDREF #REQUIRED
antalvaror CDATA #IMPLIED
personal IDREF #IMPLIED
kassanummer CDATA #IMPLIED
tid CDATA #IMPLIED>
<!ELEMENT betalning (betaldmoms*)>
<!ATTLIST betalning mottagetkontant CDATA #IMPLIED
subtotal CDATA #IMPLIED
attbetala CDATA #IMPLIED
pengartillbaka CDATA #IMPLIED
missadebonuspoäng CDATA #IMPLIED>
<!ELEMENT betaldmoms EMPTY>
<!ATTLIST betaldmoms moms IDREF #IMPLIED
summa CDATA #IMPLIED
exklusivemoms CDATA #IMPLIED>
<!ELEMENT kvittorad EMPTY>
<!ATTLIST kvittorad
vara IDREF #REQUIRED
kvantitet CDATA #IMPLIED
summa CDATA #REQUIRED
prisjustering CDATA #IMPLIED
extrapris CDATA #IMPLIED>
<!ELEMENT momsklasser (moms+)>
<!ELEMENT moms EMPTY>
<!ATTLIST moms momsid ID #REQUIRED
procentsats CDATA #REQUIRED></code>
mariahallen.xsl
<code><?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="databas">
<html>
<body>
<xsl:apply-templates select="butiker/butik[@butiksnamn='Vivo MARIAHALLEN']"/>
<!--<xsl:apply-templates select="kvitton/kvitto[@butik-ref=//butik[@butiksnamn='Vivo MARIAHALLEN']/@butikid]"/>-->
<xsl:apply-templates select="kvitton/kvitto[@butik-ref='B1']"/>
</body>
</html>
</xsl:template>
<xsl:template match="butik">
<h2>
<xsl:value-of select="@butiksnamn"/>
</h2>
<xsl:apply-templates select="öppettider"/>
<xsl:apply-templates select="telefonnummer"/><xsl:text> </xsl:text>
Org.<xsl:value-of select="@orgnr"/><br/>
SÖDERS STÖRSTA<br/>LIVSMEDELSBUTIK<br/>NU I 3 PLAN!!<br/>
</xsl:template>
<xsl:template match="öppettider">
Öppet:
<xsl:value-of select="öppettid/@veckodag"/> <xsl:text> </xsl:text>
<xsl:value-of select="öppettid/@öppningstid"/> -
<xsl:value-of select="öppettid/@stängningstid"/>
<br />
</xsl:template>
<xsl:template match="telefonnummer">
Tel:
<xsl:value-of select="@riktnummer"/>/
<xsl:value-of select="@nummer"/>
</xsl:template>
<xsl:template match="kvitto">
<br/>
<xsl:apply-templates select="kvittorad"/>
<xsl:apply-templates select="betalning"/>
<br/>
Du betjänades av
<br/>
<xsl:variable name="personalidref" select="@personal"/>
<!--<xsl:value-of select="//kassapersonal[@anställningsnummer=$personalidref]/namn/@förnamn"/>-->
<xsl:value-of select="id(@butik-ref)/kassapersonal/namn/@förnamn"/>
<br/>
<br/>
<xsl:value-of select="@kassanummer"/>/<xsl:value-of select="//kassapersonal[@anställningsnummer=$personalidref]/@anställningsnummer"/>
<xsl:text> </xsl:text><xsl:value-of select="@tid"/>
</xsl:template>
<xsl:template match="kvittorad">
<xsl:variable name="idref" select="@vara"/>
<xsl:value-of select="//vara[@varuid=$idref]"/><xsl:text> </xsl:text>
<xsl:value-of select="@summa"/><br/>
</xsl:template>
<xsl:template match="betalning">
Subtotal <xsl:value-of select="@subtotal"/>
<br/><br/>
<xsl:if test="@missadebonuspoäng">
MISSAT BONUSKÖP
<br/>
MISSADE BONUSPOÄNG:
<xsl:value-of select="@missadebonuspoäng"/>
<br/><br/><br/>
</xsl:if>
Totalt <xsl:value-of select="../@antalvaror"/> varor.
<xsl:value-of select="@subtotal"/>
<br/>
Att betala <xsl:value-of select="@attbetala"/>
<br/>
<br/>
Kontant <xsl:value-of select="@attbetala"/>
<br/>
<br/>
Mottaget <xsl:value-of select="@mottagetkontant"/>
<br/>
<br/>
Tillbaka <xsl:value-of select="@pengartillbaka"/>
<br/>
<br/>
MOMSSPECIFIKATION:
<br/>
<xsl:apply-templates select="betaldmoms"/>
<br/>
Textilavdelningen öppen 11-19
<br/>
Bytesrätt 7 dagar, 3 dagar öppet köp.
<br/>
Underkläder och badkläder bytes ej!
<br/>
TACK FÖR BESÖKET!
<br/>
VÄLKOMMEN ÅTER
<br/>
<br/>
</xsl:template>
<xsl:template match="betaldmoms">
<xsl:variable name="momsidref" select="@moms"/>
<xsl:value-of select="//moms[@momsid=$momsidref]/@procentsats"/> %
<xsl:text> </xsl:text>
<xsl:value-of select="@exklusivemoms"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@summa"/>
<br/>
</xsl:template>
</xsl:stylesheet></code>
kvitton.xml
<code><?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE KVITTO SYSTEM "kvitto.dtd">
<?xml-stylesheet type="text/xsl" href="mariahallen.xsl"?>
<databas>
<butiker>
<butik butikid="B1" orgnr="556368-6921" butiksnamn="Vivo MARIAHALLEN">
<telefonnummer riktnummer="08" nummer="6695835"/>
<öppettider>
<öppettid veckodag="alla dagar" öppningstid="8" stängningstid="22"/>
</öppettider>
<kassapersonal anställningsnummer="B0412">
<namn förnamn="per åke" efternamn="andersson"/>
</kassapersonal>
</butik>
<butik butikid="B2" orgnr="556030-5921" butiksnamn="Konsum Mariatorget">
<telefonnummer riktnummer="08" nummer="6435631"/>
<kassapersonal anställningsnummer="14">
<namn efternamn="Eiman"/>
</kassapersonal>
</butik>
<butik butikid="B3" orgnr="556558-8224" butiksnamn="Webhallen">
<telefonnummer riktnummer="08" nummer="6736000" fax="086500030"/>
<kassapersonal anställningsnummer="84109">
<namn förnamn="Marc" efternamn="Molenda"/>
</kassapersonal>
<adress gata="Sveavägen" gatunummer="39" postnummer="11134" stad="Stockholm"/>
</butik>
</butiker>
<varor>
<vara varuid="V1">skaldjur frysta</vara>
<vara varuid="V2">senapssill</vara>
<vara varuid="V3">frysta grönsaker</vara>
<vara varuid="V4">hälsofil</vara>
<vara varuid="V5">saffranssnurror</vara>
<vara varuid="V6">valnötter</vara>
<vara varuid="V7">gröna kulor</vara>
<vara varuid="V8">mellanmjölk</vara>
<vara varuid="V9" förpackning="3dl">filmjölk</vara>
<vara varuid="V10">mellanmjölk ekologisk</vara>
<vara varuid="V11">korintkakor krav</vara>
<vara varuid="V12">skinka kokt ekologisk</vara>
<vara varuid="V13">pasta färsk</vara>
<vara varuid="V14">Sims 2 (DVD)</vara>
</varor>
<kvitton>
<kvitto kvittoid="K1" butik-ref="B1" antalvaror="4" personal="B0412" kassanummer="K05" tid="07-12-01 19:17">
<kvittorad vara="V1" summa="29,90"/>
<kvittorad vara="V2" summa="22,90"/>
<kvittorad vara="V3" summa="24,90"/>
<kvittorad vara="V4" summa="17,90"/>
<betalning mottagetkontant="116,00" subtotal="95,60" attbetala="95,50" pengartillbaka="20,50" missadebonuspoäng="95,60">
<betaldmoms moms="M2" summa="8,32" exklusivemoms="77.70"/>
<betaldmoms moms="M1" summa="3,58" exklusivemoms="17.90"/>
</betalning>
</kvitto>
<kvitto kvittoid="K2" butik-ref="B2" antalvaror="9">
<kvittorad vara="V5" summa="19,90"/>
<kvittorad vara="V6" summa="14,90"/>
<kvittorad vara="V7" summa="46,90"/>
<kvittorad vara="V8" summa="6,55"/>
<kvittorad vara="V9" summa="4,10"/>
<kvittorad vara="V10" summa="3,95"/>
<kvittorad vara="V11" summa="14,90" extrapris="true"/>
<kvittorad vara="V12" summa="16,90"/>
<kvittorad vara="V13" summa="19,90"/>
<betalning mottagetkontant="150,00" subtotal="148,00" attbetala="148,00" pengartillbaka="2,00">
<betaldmoms moms="M2" summa="15,86"/>
</betalning>
</kvitto>
<kvitto kvittoid="K3" butik-ref="B3" kassanummer="1" tid="06-12-17 13:57">
<kvittorad vara="V14" summa="349,00"/>
<betalning mottagetkontant="349,00" subtotal="329,00" attbetala="349,00">
<betaldmoms moms="M1" summa="69,80" exklusivemoms="279,20"/>
</betalning>
</kvitto>
</kvitton>
<momsklasser>
<moms momsid="M1" procentsats="25"/>
<moms momsid="M2" procentsats="12"/>
<moms momsid="M3" procentsats="6"/>
</momsklasser>
</databas></code>Sv: id()-funktionen i Firefox
Vilken version av FF testade du med?
Ett alternativ är att du använder <xsl:key> och key() istället för id().
http://www.w3.org/TR/xslt#keySv: id()-funktionen i Firefox
Sv:id()-funktionen i Firefox
Edit: Märkte även lite andra småfel. <code><!DOCTYPE KVITTO SYSTEM "kvitto.dtd"></code> borde väl egentligen vara <code><!DOCTYPE databas SYSTEM "kvitto.dtd"></code> och <code><?xml version="1.0" encoding="ISO-8859-1"?></code> hör nog inte hemma i DTD:n, eftersom det inte är en XML-fil? Det funkar inte i Firefox trots ändringarna, dock, men Google ger mig en länk med svaret på varför: http://www-128.ibm.com/developerworks/xml/library/x-ffox2/index.html
"Firefox does not support DTD validation. It doesn't read DTDs in external files, but it also doesn't use any declarations within the document (called the internal subset) for validation."Sv: id()-funktionen i Firefox
Sv:id()-funktionen i Firefox
"Du betjänades av
per åke" men i FF får jag:
"Du betjänades av
"
Jag får alltså inget felmeddelande eller så, utan det är bara bristen på utskrift som visar att något inte stämmer. Får ni andra en utskrift av "per åke" även i Firefox? Jag lyckas som sagt bara få det om jag placerar DTD:n internt istället för externt.Sv: id()-funktionen i Firefox
Sv: id()-funktionen i Firefox
[Edit]
Ah, nu ser jag att det inte alls funkar... :)
Skillnaden var för liten för att jag skulle upptäcka den, ber om ursäkt.
[/Edit]
DTD:n är ett s.k. external subset och det är valfritt att ha med xml-deklarationen högst upp.
Som sagt: pröva att använda keys istället. Det borde funka.Sv:id()-funktionen i Firefox
Sv: id()-funktionen i Firefox
id() får bara förekomma som första steg i ett pattern.