2010-12-13 11 views
1

Ich verwende Saxon & XSLT, um HTML-Dokumente zu transformieren, über die ich keine Kontrolle habe.Erlaube ungültige HTML-Zeichen in der XSLT-Transformation

Diese Dokumente können Zeichen enthalten, die wirklich codiert werden sollten, z.

™

statt der

™ 

codiert Wie es aussieht, Saxon die folgende Ausnahme während der wirft Transformation von HTMLEmitter:

else if (c >= 127 && c < 160) { 
         // these control characters are illegal in HTML 
         DynamicError err = new DynamicError(
         "Illegal HTML character: decimal " + (int) c); 
         err.setErrorCode("SERE0014"); 
         throw err; 

Gibt es trotzdem mehr zu sein nachsichtig, und sag Saxon, diese Charaktere zu ignorieren und durchzulassen, wie sie sind - oder - wie konfiguriere ich Saxon, um den XMLEmitter zu benutzen und nicht der HTMLEMitter?

+0

XML erlaubt beliebige Zeichen, solange die Kodierung richtig ist. Die einzigen Ausnahmen sind die üblichen: '<> '" & 'die über Entity-Referenzen ausgedrückt werden müssen. Was ist ein _HTML-Zeichen_? – musiKk

+0

@Dimitre: Das ist eine faire' xslt' Frage. –

+0

@Alejandro: Ich würde stimme zu, ob der Titel der Frage korrekt war und ob nicht nur nach Saxon gefragt wurde.Im Titel geht es um die Frage, wie man mit Saxon mit ungültigen XML-Zeichen arbeiten soll, während das OP eigentlich will, wie man bestimmte Sonderzeichen ausgibt. –

Antwort

4

Dieses Zeichen ist in HTML ungültig, da es abhängig von der Codepage des Benutzers nicht unbedingt wie erwartet dargestellt wird. Sie möchten den richtigen Codepunkt &#x2122; verwenden und sicherstellen, UTF-8-Codierung zu verwenden.

EDIT: Charakter-Karte

<xsl:character-map name="TM"> 
    <xsl:output-character character="&#153;" string="&#x2122;"/> 
</xsl:character-map> 
+0

Ich weiß, dass es sich um ungültiges HTML handelt, aber um des Arguments willen, ist es sowieso, es trotzdem zu ignorieren. Ich kann den Quell-HTML-Code NICHT ändern. – Joel

+1

Können Sie in Ihrem XSLT eine Character-Map verwenden, um das ungültige Zeichen in die korrekte Codierung zu konvertieren? –

+0

+1 Gute Antwort. –

2

Saxon ist ein XSLT-Prozessor, kein XML-Parser. Wenn Sie bei der Analyse von Eingabedokumenten Fehler bekommen, dann ist es der XML-Parser (und nicht Saxon), der sich beschwert und das bedeutet, dass Ihre Eingabe kein wohlgeformtes XML ist. Auf der Java-Plattform, wenn die Eingabe HTML und nicht XML ist, könnten Sie mit etwas wie TagSoup http://home.ccil.org/~cowan/XML/tagsoup/ anstelle eines XML-Parsers kommen.

Auf der anderen Seite stimme ich dem bereits gemachten Kommentar zu, XNL baut auf und unterstützt Unicode, so dass Ihr Eingabedokument Unicode-Zeichen verwenden kann, solange die Dokumente korrekt codiert sind und die verwendete Codierung in der XML-Deklaration deklarieren. Bei Unicode lautet der Codepunkt von "TM" 8482, nicht 153. Ich nehme an, dass Ihre Eingabedokumente eine Windows-Codepage wie 1252 verwenden. In diesem Fall müssen Ihre Dokumente mit <?xml version="1.0" encoding="Windows-1252"?> beginnen, damit der XML-Parser das weiß.

+0

OK, aber unter der Annahme, dass ich absolut nicht die Quell-HTML ändern kann, und vorausgesetzt, die Quellcodierung Erklärung ist falsch, gibt es eine Möglichkeit, dies durchzugeben (und ja, ich weiß es kann nicht rendern, aber für meinen Anwendungsfall, der irrelevant ist) – Joel

+0

+1 Auch gute Antwort. –

2

Neben der @ Martin Honnen Antwort darauf hin, dass 153 ™ nicht der UNICODE Punkt für den Charakter ist, aber 8482 und @ Jim Garrison recomendation von xsl:character-map (wenn Sie nicht korrekt den Zeichensatz für Ihre Eingangsquelle) angeben kann, ist hier die reazon für den Fehlerbericht von http://www.w3.org/TR/xslt-xquery-serialization/#HTML_CHARDATA:

Bestimmte Zeichen, speziell die 0.123.Steuerzeichen # x7F- # x9F, sind legal in XML, aber nicht in HTML. Es ist ein Serialisierungsfehler [err: SERE0014] zu Verwenden Sie die HTML-Ausgabemethode, wenn solche Zeichen in der Instanz das Datenmodell angezeigt werden. Der Serializer MUSS den Fehler signalisieren.

Verwandte Themen