2010-03-17 16 views
14

Ho bisogno di decifrare i caratteri XML dall'interno dei nodi XML con l'aiuto solo delle trasformazioni XSLT. Ho <text>&lt;&gt;and other possible characters</text> e ho bisogno di prenderlo come HTML formattato in modo valido quando lo metto all'interno del tag body.Come rimuovere i caratteri XML con l'aiuto di XSLT?

+0

Non sono sicuro di aver capito ... <e> sono HTML valido. Stai dicendo che vuoi trasformarli in parti di tag HTML, ad es. trasformare "<i> pippo </i >" in " pippo"? – wdebeaum

+0

Hai assolutamente ragione! – Artic

+0

Ho appena provato a farlo in XSL 1.0, e si è rivelato essere davvero sgradevole (2.0 potrebbe essere un po 'meglio, ma non è ampiamente supportato). A meno che non si riesca a eseguire il trucco di escape-output-escape, è fondamentalmente necessario analizzare l'HTML in ogni nodo di testo e creare in modo ricorsivo gli elementi usando e . Supponendo che questo è in un browser web, forse si potrebbe farlo in JavaScript invece (o anche sul lato server)? – wdebeaum

risposta

35
<xsl:template match="text"> 
    <body> 
    <xsl:value-of select="." disable-output-escaping="yes" /> 
    </body> 
</xsl:template> 

Si noti che non è più garantito che l'output XML sia ben formato.

+4

Vorrei anche notare che disable-output-escaping è una funzione di serializzazione opzionale. Non è supportato, ad esempio, dal processore XSLT utilizzato nei browser Mozilla come Firefox, dal momento che questi eseguono direttamente il rendering dell'albero dei risultati e non lo serializzano. –

+1

ciao quando il tag
si è verificato nella stringa, quindi disable-output-escaping = "sì" non funziona. –

1

Non ho trovato risposta a questa domanda. Quindi sono giunto alla conclusione che questo non è il modo di farlo. Ho trovato soluzione per questo problema, file senza escape sul lato server.

+0

Ehm ... Cosa c'è che non va nella mia risposta? Questo * è * il modo di fare ciò che chiedi. – Tomalak

+0

Il tuo suggerimento disabilita l'escaping dell'output e ho bisogno di unescape di simboli come & nbsp su "". – Artic

+2

Che è * esattamente * che cosa significa "disabilitazione dell'uscita in uscita". Se il tuo input fosse corretto per l'escape, il che non è vero, avresti "<" e ">", e questi si trasformerebbero in "<' and '>". E poi avresti '& nbsp;', che si trasformerebbe in ' '. E questa è una sequenza di escape HTML perfettamente legale che non ha bisogno di ulteriori traduzioni in "". Il fatto che tu abbia il valore " " significa che il tuo input è rotto per cominciare. – Tomalak

3

Con xslt 2.0 ho creato questo. Nota che l'output non è garantito per essere corretto xml, una semplice disuguaglianza può rovinare il tuo output.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<xsl:character-map name="a"> 
    <xsl:output-character character="&lt;" string="&lt;"/> 
    <xsl:output-character character="&gt;" string="&gt;"/> 
</xsl:character-map> 

<xsl:output use-character-maps="a"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
0

Un'altra soluzione. Questo non usa il postprocessore xml, quindi facilmente utilizzabile come input di ulteriore elaborazione xslt. Garantito anche per creare xml valido. Questa è una soluzione xslt 2.0, che sfugge al testo all'interno di tag "documentazione", testata con saxon. È necessario modificare la variabile "allowedtags" per definire il proprio modello di dati. I bambini immediati sono i tag, quelli sotto di loro sono gli attributi possibili. La lettura dei tag consentiti da un xsd è lasciata come esercitazione per il lettore (per favore condividila con me).

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="http://magwas.rulez.org/my" 
> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:variable name="allowedtags"> 
<li/> 
<ul/> 
<br/> 
<a><href/></a> 
</xsl:variable> 

<xsl:template match="@*|*|processing-instruction()|comment()" mode="unescape"> 
    <xsl:copy> 
     <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()" mode="unescape"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="documentation" mode="unescape"> 
    <documentation> 
    <xsl:call-template name="doc"> 
     <xsl:with-param name="str"> 
      <xsl:value-of select="."/> 
     </xsl:with-param> 
    </xsl:call-template> 
    </documentation> 
</xsl:template> 

<xsl:template name="doc"> 
    <xsl:param name="str"/> 
    <xsl:variable name="start" select="fn:substring-before($str,'&lt;')"/> 
    <xsl:variable name="rest" select="fn:substring-after($str,'&lt;')"/> 
    <xsl:variable name="fulltag" select="fn:substring-before($rest,'&gt;')"/> 
    <xsl:variable name="tagparts" select="fn:tokenize($fulltag,'[ &#xA;]')"/> 
    <xsl:variable name="tag" select="$tagparts[1]"/> 
    <xsl:variable name="aftertag" select="fn:substring-after($rest,'&gt;')"/> 
    <xsl:variable name="intag" select="fn:substring-before($aftertag,fn:concat(fn:concat('&lt;/',$tag),'&gt;'))"/> 
    <xsl:variable name="afterall" select="fn:substring-after($aftertag,fn:concat(fn:concat('&lt;/',$tag),'&gt;'))"/> 
    <xsl:value-of select="$start"/> 
    <xsl:choose> 
    <xsl:when test="$tag"> 
     <xsl:variable name="currtag" select="$allowedtags/*[$tag = local-name()]"/> 
     <xsl:if test="$currtag"> 
      <xsl:element name="{$currtag/local-name()}"> 
       <xsl:for-each select="$tagparts[position()>1]"> 
        <xsl:variable name="anstring" select="fn:replace(.,'^([^ &#xA;=]*)=.*$','$1')"/> 
        <xsl:variable name="antag" select="$currtag/*[$anstring = local-name()]"/> 
        <xsl:if test="$antag"> 
         <xsl:attribute name="{$antag/local-name()}"> 
          <xsl:value-of select="fn:replace(.,'^.*[^ &#34;]*&#34;([^&#34;]*)&#34;.*','$1')"/> 
         </xsl:attribute> 
        </xsl:if> 
       </xsl:for-each> 
       <xsl:if test="$intag"> 
        <xsl:call-template name="doc"> 
         <xsl:with-param name="str"> 
          <xsl:value-of select="$intag"/> 
         </xsl:with-param> 
        </xsl:call-template> 
       </xsl:if> 
      </xsl:element> 
     </xsl:if> 
     <xsl:if test="$afterall"> 
      <xsl:call-template name="doc"> 
       <xsl:with-param name="str"> 
        <xsl:value-of select="$afterall"/> 
       </xsl:with-param> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:when> 
    <xsl:otherwise> 
        <xsl:value-of select="$str"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 
+0

'@ * | * | processing-instruction() | comment()' può essere abbreviato in '@ * | nodo() ' – Vampire

Problemi correlati