Avatar billede ljungberg Nybegynder
26. marts 2008 - 16:12 Der er 15 kommentarer

brug af ' eller '

Jeg har brug for at outputte ' eller ' istedet for en apostrof i meta sektionen paa en html side via xslt. Der er ingen problemer med fx &.

Hvis jeg fx har foelgende:

<xsl:variable name="aposEscape">&#39; &amp; &apos;</xsl:variable>

<xsl:element name="meta">
        <xsl:attribute name="name">DC.title</xsl:attribute>
        <xsl:attribute name="content">
          <xsl:value-of select="$aposEscape" />
        </xsl:attribute>
      </xsl:element>

outputtes <meta name="DC.title" content="' &amp; '" />

Hvorfor er det kun apostroffer (og &qout;) der bliver lavet om?
Avatar billede jokkejensen Novice
31. marts 2008 - 15:26 #1
1: dublin core meta tags er vist lidt outdated :)

2: <xsl:variable name="aposEscape"><![CDATA[&#39; &amp; &apos;]]></xsl:variable>
Avatar billede ljungberg Nybegynder
31. marts 2008 - 15:52 #2
Dublin core bliver brugt pga det soegemodul jeg benytter, saa der er ingen vej udenom ;)

Din loesning virkede naesten. ved at indsaette
<xsl:variable name="aposEscape"><![CDATA[&apos;]]></xsl:variable>
faar jeg nu &amp;apos; dvs, & tegnet laves om til &amp; saa hvad goer jeg nu for at beholde mit & som et & tegn?
Avatar billede jokkejensen Novice
31. marts 2008 - 16:45 #3
<![CDATA[ '¨´#"!¤%"#¤&% &&&& &amp osv >> ><<<<< ]]>

Men tager man ex:

<xsl:variable name="htmlEncoded"><[CDATA[&apos;]]>


Prøv så:

<xsl:value-of select="$htmlEncoded" /> // vil udskrive &apos;
<xsl:value-of select="$htmlEncoded" disable-output-escaping="true" /> // som vil htmldecode den..

Altså man blander ikke htmlencoded tegn sammen med ikke htmlencoded tegn, det vil skabe forvirring. (eller xml entities om man vil)

Håber du er med.

/JJ
Avatar billede jokkejensen Novice
31. marts 2008 - 16:45 #4
<xsl:variable name="htmlEncoded"><[CDATA[&apos;]]></xsl:variable>
Avatar billede ljungberg Nybegynder
01. april 2008 - 11:54 #5
Hvis jeg foelger dit eksempel saa har jeg nu

<xsl:variable name="aposEscape"><![CDATA[&apos;]]></xsl:variable>

<xsl:element name="meta">
<xsl:attribute name="name">DC.title</xsl:attribute>
<xsl:attribute name="content">
  <xsl:value-of select="$aposEscape" />
</xsl:attribute>
</xsl:element>

Men i kildekoden faar jeg stadig <meta name="DC.title" content="&amp;apos;" />

som output! Ogsaa selvom jeg tilfoejer disable-output-escaping="yes"
Avatar billede jokkejensen Novice
01. april 2008 - 12:04 #6
hold on, jeg tester lige selv..
Avatar billede jokkejensen Novice
01. april 2008 - 12:11 #7
doh apos er kun en xml entitet og ikke en html.. nok derfor :), finder lige løsning..

Der skal altså være en apostrof (') i dit metatag og ikke &apos;

Det er selvfølgeligt ikke så heldig en problem stilling men jeg skal lige forstå det korrekt:

Du modtager <node>Anders&apos;s hat</node>

og vil have det til at stå <meta name="DC.title" content="Anders's hat" />

Right?

/JJ
Avatar billede ljungberg Nybegynder
01. april 2008 - 12:46 #8
Mange tak for din hjaelp og taalmodighed indtil videre ;) men det er ikke helt det jeg vil opnaa. Jeg har teksten Anders's hat, men vil lave det om til <meta name="DC.title" content="Anders&apos;s hat" /> da mit soegemodul ikke kan finde ud af at indeksere titler med apostroffer, men kun indekserer titlen indtil apostroffen og saa dropper resten.
Avatar billede jokkejensen Novice
01. april 2008 - 13:05 #9
doh.. det virker jo fint med dit første forslag :

      <xsl:variable name="aposEscape"><![CDATA[&#39;]]></xsl:variable>
      <xsl:value-of select="$aposEscape" disable-output-escaping="yes"></xsl:value-of>

Men du kan af min bedste overbevisning ikke lave ' om til &#39; uden at bruge en replace funktionalitet.

Her er den løsning jeg finder smykkest:

      <xsl:variable name="x"><![CDATA[Anders's hat]]></xsl:variable>
      <xsl:value-of select="$x"></xsl:value-of>
      <xsl:variable name="x2">
      <xsl:call-template name="replace-string">
          <xsl:with-param name="text" select="$x"></xsl:with-param>
          <xsl:with-param name="to"><![CDATA[&#39;]]></xsl:with-param>
          <xsl:with-param name="from"><![CDATA[']]></xsl:with-param>
      </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="$x2" disable-output-escaping="yes" />

<!-- NY TEMPLATE -->
      <!-- reusable replace-string function -->
    <xsl:template name="replace-string">
        <xsl:param name="text"/>
        <xsl:param name="from"/>
        <xsl:param name="to"/>

        <xsl:choose>
            <xsl:when test="contains($text, $from)">
                <xsl:variable name="before" select="substring-before($text, $from)"/>
                <xsl:variable name="after" select="substring-after($text, $from)"/>
                <xsl:variable name="prefix" select="concat($before, $to)"/>
                <xsl:value-of select="$before"/>
                <xsl:value-of select="$to"/>
                <xsl:call-template name="replace-string">
                    <xsl:with-param name="text" select="$after"/>
                    <xsl:with-param name="from" select="$from"/>
                    <xsl:with-param name="to" select="$to"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
Avatar billede jokkejensen Novice
01. april 2008 - 13:07 #10
og det er ofte noget lettere at sætte attributter gennem

<xsl:variable name="x" select="'test'" />

<meta name="DC.subject" content="{$x}" />

altså {} fortæller det er xslt i atributter.

/JJ
Avatar billede ljungberg Nybegynder
01. april 2008 - 14:33 #11
Yesyes, replace funktionaliteten er lavet, mit problem opstod da jeg skulle have apostroffen lavet om til &apos; eller &#39;

Og jeg har stadig problemer.

Hvis jeg fodrer min replacer med foelgende:

<xsl:with-param name="text" select="sc:fld('title',.)" />
<xsl:with-param name="from"><![CDATA[']]></xsl:with-param>
<xsl:with-param name="to"><![CDATA[&#39;]]></xsl:with-param>

Hvor $text er "A Bankrupt's Imperial's Agenda", saa faar jeg foelgende output ligemeget om jeg har disable-output-escaping sat til "yes" eller "no":

<meta name="DC.title" content="A Bankrupt&amp;#39;s Imperial&amp;#39;s Agenda" />
Avatar billede jokkejensen Novice
01. april 2008 - 14:43 #12
<!-- Laver &amp; og de andre html encoded om -->
<xsl:variable name="textDecoded"><xsl:value-of select="sc:fld('title', .)"  disable-output-escaping="true"/></xsl:variable>


<!-- Erstatter &apos; -->
<xsl:with-param name="text" select="$textDecoded" />
<xsl:with-param name="from"><![CDATA[']]></xsl:with-param>
<xsl:with-param name="to"><![CDATA[&#39;]]></xsl:with-param>
Avatar billede jokkejensen Novice
01. april 2008 - 14:44 #13
jeg ved ikke om du bare kan :

<xsl:with-param disble-output-escaping="true" name="text" select="sc:fld('title',.)" />
<xsl:with-param name="from"><![CDATA[']]></xsl:with-param>
<xsl:with-param name="to"><![CDATA[&#39;]]></xsl:with-param>

Kan se du også arbejder med sitecore :)

/J
Avatar billede jokkejensen Novice
01. april 2008 - 14:45 #14
ellers kan du lave den disable-output-escaping som en parameter mere på din replace-string template.. altså lave en true/false værdi og paste med ned i templaten, og udfra den endten disable escaping eller ej.

/JJ
Avatar billede jokkejensen Novice
01. april 2008 - 14:51 #15
før du replacer vel og mærket.. ellers:

fra:
Peter & Anders's hat

[Replace]

til:
Peter & Anders&#39 hat;

[disable output escape]
til
Peter &amp; Anders&amp;#39; hat -> altså den erstatter også & tegnet i &#39; ved disable-output-escaping.
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