Avatar billede ibrene Nybegynder
04. december 2002 - 15:11 Der er 15 kommentarer og
1 løsning

Special char

Hejsa

Jeg har lidt problemer med min XML.

Hvis der er et &-tegn i det, så vil den ikke vise det. Hvad skal jeg erstatte et og tegn med.

Samt vil jeg også gerne søge og erstatte ' med ''.

Jeg har rotine som kan søge og erstatte, men den vil ikke godkende at jeg sætte et ' ind og kommer frem med fejl.

Nogle som kan hjælpe mig med det?
Avatar billede simon.ulsnes Nybegynder
04. december 2002 - 15:15 #1
Har du prøvet:

<dittag><![CDATA[ Din tekst her... ]]></dittag>

// Simon
Avatar billede ibrene Nybegynder
04. december 2002 - 15:23 #2
Det tegner godt, for nu kan jeg uden om skrive det som jeg gerne vil.
MEn når jeg sætter den ind i her:

<xsl:with-param name="with" select="'<![CDATA[']]>'"/>

Så kommer dne op med en fejl, nogle ideer?
Avatar billede simon.ulsnes Nybegynder
04. december 2002 - 15:26 #3
Hvad vil du? (jeg har ikke så godt styr på XSL)
Avatar billede ibrene Nybegynder
04. december 2002 - 15:31 #4
Mit problem er meget simplet. JEg henter noget data fra en XMl file som jeg kan smide i en database DB2. Så jeg bruger min XSL til at lave alle insert-sætninger.

Men da der kan forekomme ' i mit XMl, hvilket så gør at der kommer problemer og jeg kan ikke sætte noget ind. Så jeg skal havde lavet alle ' om til '' (to '' efter hinanden).

Jeg har følgede kode:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

  <xsl:template name="string-replace">
    <xsl:param name="text"/>
    <xsl:param name="replace"/>
    <xsl:param name="with"/>
    <xsl:choose>
      <xsl:when test="contains($text,$replace)">
        <xsl:value-of select="substring-before($text,$replace)"/>
        <xsl:value-of select="$with"/>
        <xsl:call-template name="string-replace">
          <xsl:with-param name="text" select="substring-after($text,$replace)"/>
          <xsl:with-param name="replace" select="$replace"/>
          <xsl:with-param name="with" select="$with"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>



<xsl:template match="/">
    <xsl:for-each select="tforhandler/forhandler">
        |<xsl:value-of select="cmaerkesites"/>|
        <br/>
        <xsl:call-template name="string-replace">
            <xsl:with-param name="text" select="cmaerkesites"/>
            <xsl:with-param name="replace" select="'VW'"/>
            <xsl:with-param name="with" select="<![CDATA[']]>"/>
        </xsl:call-template>   
        <br/>
        <![CDATA[']]>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Avatar billede simon.ulsnes Nybegynder
04. december 2002 - 15:42 #5
Ok... prøv at sætte en \ (backslash) foran alle dine specialtegn.
Avatar billede ibrene Nybegynder
04. december 2002 - 15:46 #6
JEg har nog prøvet
\<\!\[CDATA\[\&\]\]\>
<![CDATA[\&]]>
og ingen forskel
Avatar billede simon.ulsnes Nybegynder
04. december 2002 - 15:49 #7
Nej, uden alt det der ekstra CDATA-halløj...
& = \&
' = \'
" = \"
osv.
Avatar billede simon.ulsnes Nybegynder
04. december 2002 - 15:50 #8
<xsl:with-param name="with" select="<![CDATA[']]>"/>
bliver til
<xsl:with-param name="with" select="\'"/>
Avatar billede ibrene Nybegynder
04. december 2002 - 15:52 #9
Den kommer med denne fejl:

Unexpected character in query string. -->\<--'
Avatar billede simon.ulsnes Nybegynder
04. december 2002 - 15:57 #10
Hmmm... Jeg tror måske det er nødvendigt at vælge en anden teknologi end XSL... PHP eller ASP eller ASP.NET f.eks...

Jeg har i hvert fald ikke flere bud.
Avatar billede janegil Nybegynder
04. december 2002 - 16:29 #11
"&" skal representeres som "&amp;" i et XML-dokument.

Ellers tolkes det som starten på en entitet, som regel en som ikke er definert, og så er hele dokumentet misformet.
Avatar billede janegil Nybegynder
04. december 2002 - 16:35 #12
Du var vist også interessert i &quot; og &apos; ?
Avatar billede Slettet bruger
04. december 2002 - 23:17 #13
Nemlig JanEgil !!

Det gælder om at vide hvad der er det *egentlige* problem - nemlig, at XML har 5 predefinerede "entities" som kan (og bør) benyttes, for at XML parseren ikke kløjs i det: &amp; &quot; &apos; &lt; og &gt; - stedfortrædere for hhv.: & " ' < og >.

Element-indhold (dvs. tekst+tags mellem to tags) kan indeholde alle tegn, undtagen <, da det signalerer starten på et ny tag. Derfor *skal* man bruge &lt; ("Less-Than") istedet for dette tegn - ELLER: man kan wrappe det hele i en CDATA-sektion, vha. <![CDATA[ ... ]]> hvilket fortæller parseren at indholdet *ikke* skal forstås som markup.

I attributter er sagen anderledes, da man ikke kan sætte CDATA ind i attributter - igen kan man ikke bruge <, men heller ikke det tegn man har brugt som delimiter (dvs. apostrof eller quote - begge er lovlige), da parseren jo så tror at attribut-teksten er afsluttet - eks.:

<tag attribut="værdi med "quote" karakter" />

Parseren læser ovenstående som:
- XML element: 'tag'
- attribut: 'attribut'
- textnodeværdi til attribut: 'værdi med '
- "garbage": '"quote" karakter" />'

Entities bruges altså til at "escape" tegn der har en speciel mening i dokumenttypen (og har eksisteret i HTML siden tidernes morgen - browserne er bare for ringe til at brokke sig når folk koder forkert :-)

Den korrekte version er altså:

<tag attribut="værdi med &quot;quote&quot; karakter" />

/CS
Avatar billede Slettet bruger
04. december 2002 - 23:19 #14
Hmm - den der finder fejlen i ovenstående eksempel får en gratis flødebolle pr. email :-)

/CS
Avatar billede janegil Nybegynder
05. december 2002 - 09:31 #15
Feil vet jeg ikke. Kanskje en mild overkill,
<tag attribut='værdi med "quote" karakter' />
burde holde? Valg av løsning avhenger nok av om det er menneske eller maskin som skal skrive fila.

For øvrig er det ikke "browserne" som er for ringe, det er IE. Fordi hjernedøde webmastere bare tester mot IE, ble de andre – selv Opera – tvunget til å følge etter.
Avatar billede Slettet bruger
05. december 2002 - 12:06 #16
Janegil >>> Vi kan hurtigt blive enige om at IE er ringe - men de andre har altså også deres små & store quirks. I min "forklaring" af entity-problemet, skrev jeg jo faktisk om det med delimiteren - men valgte med vilje ikke at vise den "nemme" løsning, da det kan forvirre en forklaring. - Specielt når der er så mange der desværre er tilfredse lige så snart "det virker" (ja, typisk i IE)...

/CS
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