2011-01-14 9 views
4

Ich transformiere ein XML-Dokument mit XSLT in XHTML, wobei Saxon, XSLT 2.0-konform verwendet wird.Unescape während der XSLT-Transformation

Innerhalb meiner XML-Dokumente Ich habe Knoten wie so (der Kürze halber hier gekürzt):

<script type="text/javascript"> 
    document.write('&lt;script&gt;') 
    </script> 

Was ich will, ist unesacape die Escape-Zeichen zu tun, um der Lage sein, so dass &lt; wird < und &gt;> wird, idealerweise nur dann, wenn sie innerhalb der Skriptknoten auftreten.

wäre die endgültige Ausgabe dann:

<script type="text/javascript"> 
    document.write('<script>') 
    </script> 

Ist dies möglich, und alle Vorschläge, wie?

+1

Joel Ich bin neugierig, seit wann ist Xalan XSLT 2.0 kompatibel? Nach meinem Wissen (http://xml.apache.org/xalan-j/) implementiert es XSLT 1.0 und verschiedene Erweiterungen. –

+0

Hoppla - Mein Schlechter. Ich benutze Saxon. Bearbeitet, um das zu reflektieren. – Joel

Antwort

3

Mit dem html Serialisierungsmethode, script Inhalt nicht entgangen bekommt.

Von http://www.w3.org/TR/xslt#section-HTML-Output-Method

Die html Ausgabeverfahren sollte nicht perform für den Inhalt der entweicht die script und style Elemente

aktualisieren

Als Dr. @ Michael Kay habe kommentiert, wenn du XH generierst TML (und das Senden mit dem richtigen MIME-Typ) für Browser, die XHTML verstehen, dann müssen Sie sich keine Gedanken über Unescaping machen. Es sollte auch darauf hingewiesen werden, dass Inline-Skripte nicht als gute Praxis angesehen werden.

Wenn Sie immer noch XHTML nach den Richtlinien für ältere Browser generieren möchten, können Sie unter xml Serialisierungsmethode den Inhalt script als CDATA-Abschnitt deklarieren.

Von http://www.w3.org/TR/xslt#section-XML-Output-Method

Die cdata-section-elements Attribut enthält eine durch Leerzeichen getrennte Liste von QNames. Jeder QName wird in expanded-name erweitert, indem der Namespace Deklarationen verwendet wird, die für das Element xsl:output gelten, in dem QName auftritt; Wenn es einen Standard-Namespace gibt, wird er für QNames verwendet, die kein Präfix haben. Die Erweiterung wird vor dem Zusammenführen von mehreren xsl:output Elementen in ein einzelnes effektives xsl:output Element durchgeführt. Wenn der erweiterte Name des Mutter von Textknoten ein Mitglied der Liste enthalten ist, dann sollte der Textnode Ausgabe als Abschnitt

Als Beispiel eines CDATA sein:

<xsl:output cdata-section-elements="xhtml:script xhtml:style" 
      xmlns:xhtml="http://www.w3.org/1999/xhtml"/> 
+3

Korrigieren. Wenn Sie die HTML-Ausgabemethode verwenden, werden die Zeichen nicht maskiert. Wenn Sie die XHTML-Ausgabemethode verwenden, werden sie mit Escapezeichen versehen, aber Sie müssen sich keine Gedanken darüber machen, solange der Browser XHTML versteht (und wenn nicht, warum dann generieren?) –

+0

@Michael Kay: Ich stimme zu: Wenn Sie XHTML generieren, brauchen Sie keine Unescence, weil der Browser XML richtig verstehen sollte. Das zur Antwort hinzufügen. –

+0

Danke beides. Ich werde meine Serialisierungseinstellungen überprüfen. – Joel

1
+1

Ja, tatsächlich. Ich fand auch diese doppelte Frage http://stackoverflow.com/questions/646194/xsl-character-escape-problem – Joel

+0

Ich denke, das tut, was ich brauche: \t \t \t \t Joel

+2

Wenn Sie auch das 'type =" text/javascript "' im Ergebnis haben wollen, dann tun Sie ein ' 'innerhalb der' xsl: copy'. –

Verwandte Themen