XSL-Zeichen-Escape-Problem

8

Ich schreibe das, weil ich wirklich an die Wand gegangen bin und nicht weitermachen kann. In meiner Datenbank habe ich HTML wie folgt entkernt: "<p>My name is Freddy and I was" .

Ich möchte es als HTML anzeigen ODER die HTML-Tags in meiner XSL-Vorlage entfernen. Beide Lösungen werden für mich funktionieren und ich werde die schnellere Lösung wählen.

Ich habe mehrere Beiträge online gelesen, kann aber keine Lösung finden. Ich habe auch disable-output-escape ohne Erfolg versucht. Grundsätzlich scheint das Problem darin zu bestehen, dass die Engine irgendwo in der XSL-Ausführung dieses <p> in folgendes umwandelt: <p> .

Es konvertiert die & in & . Wenn es hilft, hier ist mein XSL-Code. Ich habe mehrere Kombinationen mit und ohne das Ausgabe-Tag auf der Oberseite versucht.

Jede Hilfe wird geschätzt. Vielen Dank im Voraus.

%Vor%     
Marcos Buarque 14.03.2009, 16:24
quelle

4 Antworten

18

Basierend auf der Annahme, dass Sie diese HTML-Zeichenfolge haben

%Vor%

Wenn Sie es dann umgehen und in einer Datenbank speichern, wird es dies :

%Vor%

Wenn Sie das Ergebnis als XML abrufen (ohne es zuvor zu entfernen), wäre das Ergebnis this :

%Vor%

und <xsl:value-of select="." disable-output-escaping="yes" /> würden erzeugen:

%Vor%

Sie erhalten genau das gleiche, was Sie in Ihrer Datenbank haben, aber natürlich sehen Sie die HTML-Tags in der Ausgabe. Was Sie also brauchen, ist ein Mechanismus, der die folgenden String-Ersetzungen durchführt:

  • "&amp;lt;" mit "&lt;" (effektiv ändern &lt; zu < in unescaped output)
  • "&amp;gt;" mit "&gt;" (effektiv ändern &gt; zu > in unescaped output)
  • "&amp;quot;" mit "&quot;" (effektiv ändern &quot; zu " in unescaped output)
  • "&amp;amp;" mit "&amp;" (effektiv ändern &amp; zu & in unescaped output)

Von Ihrem XSL habe ich die folgende Testeingabe-XML abgeleitet:

%Vor%

Ich habe das von Ihnen bereitgestellte Stylesheet geändert und einen solchen Ersetzungsmechanismus implementiert. Wenn Sie die folgende XSLT 1.0-Vorlage darauf anwenden:

%Vor%

Dann wird dieses Ausgabe-HTML erzeugt:

%Vor%

Hinweis

  • die Verwendung eines temporären Namespaces und eingebetteter Elemente ( <my:unescape> ) zum Erstellen einer Liste von zu ersetzenden Zeichen
  • die Verwendung der Rekursion zum Emulieren eines iterativen Ersetzens aller betroffenen Zeichen in der Eingabe
  • die Verwendung des impliziten Kontexts in der Vorlage unescape , um die Information zu transportieren, welches Zeichen gerade ersetzt werden soll

Außerdem beachten Sie:

  • die Verwendung von Template-Modi, um unterschiedliche Ausgaben für dieselbe Eingabe zu erhalten (dies ersetzt den Parameter templatenumber )
  • Meistens sind keine <xsl:attribute> -Elemente erforderlich. Sie können sicher durch Inline-Notation ( attributename="{attributevalue}" )
  • ersetzt werden
  • die Verwendung der Funktion concat() zum Erstellen der URL

Im Allgemeinen ist es eine schlechte Idee, entkerntes HTML in einer Datenbank zu speichern (allgemeiner gesagt: Es ist eine schlechte Idee, HTML in einer Datenbank zu speichern.). Sie stellen sich auf alle möglichen Probleme ein, dies ist einer von ihnen. Wenn Sie diese Einstellung nicht ändern können, hoffe ich, dass Ihnen die Lösung hilft.

Ich kann nicht garantieren, dass es in allen Situationen das Richtige tut, und es kann zu Sicherheitslücken führen (denke XSS), aber der Umgang damit war nicht Teil der Frage. In jedem Fall solltest du dich selbst gewarnt fühlen.

Ich brauche jetzt eine Pause. ; -)

    
Tomalak 15.03.2009 14:22
quelle
6

Sie sollten nicht maskiertes HTML in Ihrer Datenbank speichern. Wenn Ihre Datenbank das tatsächliche & lt; Zeichen, dann würde der Befehl "disable-output-escaping" tun, was Sie wollten.

Wenn Sie die Daten nicht ändern können, müssen Sie die Daten vor der Transformation entschlüsseln.

    
David 14.03.2009 16:38
quelle
2

Fügen Sie diese Zeile Ihrem Stylesheet hinzu

%Vor%     
Tim Zhou 17.01.2012 15:56
quelle
1
  

Es ist eine schlechte Idee, HTML in einer Datenbank zu speichern

Was? Wie soll man es dann speichern? In einem XML-Dokument müssen Sie also XSLT verwenden? Als Webentwickler haben wir immer SQL-Datenbanken verwendet, um benutzerdefinierte HTML-Daten zu speichern. Es ist nichts falsch mit dieser Methode, solange es für Ihre Zwecke richtig bereinigt ist.

    
Shiggity 01.02.2010 00:37
quelle

Tags und Links