Ho bisogno di decifrare i caratteri XML dall'interno dei nodi XML con l'aiuto solo delle trasformazioni XSLT. Ho <text><>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?
risposta
<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.
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. –
ciao quando il tag
si è verificato nella stringa, quindi disable-output-escaping = "sì" non funziona. –
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.
Ehm ... Cosa c'è che non va nella mia risposta? Questo * è * il modo di fare ciò che chiedi. – Tomalak
Il tuo suggerimento disabilita l'escaping dell'output e ho bisogno di unescape di simboli come & nbsp su "". – Artic
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
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="<" string="<"/>
<xsl:output-character character=">" string=">"/>
</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>
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,'<')"/>
<xsl:variable name="rest" select="fn:substring-after($str,'<')"/>
<xsl:variable name="fulltag" select="fn:substring-before($rest,'>')"/>
<xsl:variable name="tagparts" select="fn:tokenize($fulltag,'[ 
]')"/>
<xsl:variable name="tag" select="$tagparts[1]"/>
<xsl:variable name="aftertag" select="fn:substring-after($rest,'>')"/>
<xsl:variable name="intag" select="fn:substring-before($aftertag,fn:concat(fn:concat('</',$tag),'>'))"/>
<xsl:variable name="afterall" select="fn:substring-after($aftertag,fn:concat(fn:concat('</',$tag),'>'))"/>
<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(.,'^([^ 
=]*)=.*$','$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(.,'^.*[^ "]*"([^"]*)".*','$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>
'@ * | * | processing-instruction() | comment()' può essere abbreviato in '@ * | nodo() ' – Vampire
- 1. XPath/XSLT rimuovere i tag vuoti
- 2. Come rimuovere caratteri particolari da una stringa usando XSLT?
- 3. Come ordinare un sottoelemento XML con XSLT
- 4. come unire due file xml con XSLT
- 5. XSLT rimuovere gli elementi indesiderati
- 6. C# LINQ TO XML - Rimuovere i caratteri "[]" dall'intestazione DTD
- 7. rimuovere i caratteri da URL con htaccess
- 8. Rimuovere i caratteri URL errati con JavaScript
- 9. Json: come rimuovere correttamente i caratteri di escape con json.net
- 10. saltare i nodi con XSLT
- 11. Come ripristinare i caratteri di escape XML (XML unescape)?
- 12. concatenare dinamicamente i file XML con formica e XSLT
- 13. Come si eseguono le corrispondenze di caratteri jolly con XSLT?
- 14. Come rimuovere i caratteri di controllo dalla stringa?
- 15. Come rimuovere i caratteri speciali html?
- 16. Come rimuovere i primi tre caratteri dalla stringa con C?
- 17. formattazione di stringhe, rimuovere i caratteri iniziali
- 18. XSLT - Come selezionare l'attributo XML per attributo?
- 19. Come trasformare xml con xslt e visualizzarlo nella webview Android
- 20. Come faccio a decifrare i caratteri speciali XML in Perl?
- 21. Ordinamento XSLT - come ordinare i childcode xml all'interno di un nodo genitore con un attributo
- 22. Conversione elementi XML di attributi XML utilizzando XSLT
- 23. python3 e XML/XSLT librerie
- 24. XSLT Transform XML with Namespace
- 25. come rimuovere i caratteri numerici nella tabella di mysql?
- 26. Caratteri Unicode come \ u0016 in XML
- 27. Divisione di XML in più file con XSLT
- 28. Come rimuovere i caratteri di spazio bianco tra la stringa?
- 29. Rimuovere tutti i caratteri esadecimali prima di caricare la stringa nell'oggetto documento XML?
- 30. Vantaggi di XSLT o Linq to XML
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
Hai assolutamente ragione! – Artic
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