2016-05-04 12 views
0

Ich habe ein HTML-Dokument, das ich mit XSL transformieren muss. Das HTML-Dokument enthält Verwendung von   heißtDeklarieren Sie ENTITY und definieren Sie nbsp als Zeichenfolge " "

ation.</span>&nbsp;</p><br/>All ... 

Erstens ich hatte Probleme, weil   wurde nicht definiert. So definiert ich es:

<?xml version=\"1.0\"?> 
<!DOCTYPE html [ 
    <!ENTITY nbsp "&#160;"> 
"]> 

ich so tat durch diesen Code in die HTML-Zeichenfolge vorangestellt wird, bevor es auf die Transformation zu senden. Nach der Transformation war die ENTITY-Deklaration praktisch verschwunden, und, ja, großartig, die Transformation war tatsächlich erfolgreich.

Jedoch! Da nbsp als Leerzeichen definiert wurde, wurden beim Generieren von HTML/XML die Zeichenfolgen "&nbsp;" tatsächlich durch ein Leerzeichen ersetzt.

Das ist nicht was ich will. Ich brauche diesen Teil des Ergebnisses nicht von der Quelle zu unterscheiden.

Also habe ich versucht, die nbsp neu zu definieren, etwa so:

<?xml version=\"1.0\"?> 
<!DOCTYPE html [ 
    <!ENTITY nbsp "&amp;nbsp;"> 
"]> 

jedoch jetzt anstelle eines Leerzeichens in meinem Ergebnis, sehe ich die Zeichen "&amp;nbsp;"

Wenn ich versuche, dieses:

<?xml version=\"1.0\"?> 
<!DOCTYPE html [ 
    <!ENTITY nbsp "&nbsp;"> 
"]> 

Ich bekomme eine rekursive Deklaration Ausnahme.

Wie schließe ich dann das Sonderzeichen '&' in die Definition ein?

p.s., diese Umwandlung ich bin in Java 8, Standard-Engines ausgeführt (ich denke, das ist Xalan?).

Vielen Dank!

Hier ist ein kurzes Beispiel für die Reproduktion. Entschuldigen Sie, dass Sie es nicht früher bereitgestellt haben.


package com.astraia.app.mainframe; 

import java.io.*; 
import javax.xml.transform.*; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

public class ShortExample 
{ 
    public static void main(String[] args) 
    { 
     StringBuffer htmlMain = new StringBuffer(500); 
     htmlMain .append("<html><head></head>") 
        .append(" <body>)") 
        .append("  <p data-tags=\"personal\"><strong>name: Nerea Morry, Id: 5678</strong><br/></p>") 
        .append("  <p><span>some text</span>&nbsp;</p><br/>some more text") 
        .append(" </body>") 
        .append("</html>"); 

     StringBuffer xsl = new StringBuffer(500); 
     xsl .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") 
      .append("<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">") 
      .append(" <xsl:output method=\"xml\" version=\"1.0\" encoding=\"UTF-8\" omit-xml-declaration=\"yes\" />") 
      .append(" <xsl:template match=\"node()|@*\" >") 
      .append("  <!-- Copy all nodes -->") 
      .append("  <xsl:copy>") 
      .append("    <xsl:apply-templates select=\"node()|@*\" />") 
      .append("  </xsl:copy>") 
      .append(" </xsl:template>") 
      .append(" <!-- Anonymize all text within tags indicated as personal -->") 
      .append(" <xsl:template match=\"*[@data-tags = 'personal' ]//text()[normalize-space(.) != '']\">ANONYMIZED TEXT</xsl:template>") 
      .append(" </xsl:stylesheet>"); 

     String plainHtml = htmlMain.toString(); 
     String transformation = xsl.toString(); 

     // results in &nbsp being replaced by a space 
     printResult("results in &nbsp being replaced by a space", plainHtml,"&#160;", transformation); 
     // results in seemingly non-replaced escape code &amp; 
     printResult("results in seemingly non-replaced escape code &amp;", plainHtml,"&amp;nbsp", transformation); 
     // results in recursion exception 
     printResult("results in recursion exception", plainHtml,"&nbsp;", transformation); 
     // also results in recursion exception 
     printResult("also results in recursion exception", plainHtml,"&#038;nbsp;", transformation); 

     // but what will result in: 
     // <html><head/> <body>)  <p data-tags="personal"><strong>ANONYMIZED TEXT</strong><br/></p>  <p><span>some text</span>&nbsp</p><br/>some more text </body></html> 
     // ? 
    } 

    public static void printResult(String message, String plainHtml, String definition, String transformation) { 
     System.out.print(message); 
     System.out.println(performTransformation(plainHtml,definition, transformation)); 
     System.out.println("\n-----"); 
    } 

    public static String performTransformation(String plainHtml, String definition, String transformation) 
    { 
     String retval = null; 

     try { 
      StringWriter result = new StringWriter(); 
      StringBuffer header = new StringBuffer(100); 
      header .append("<?xml version=\"1.0\"?>") 
        .append("<!DOCTYPE html [") 
        .append(" <!ENTITY nbsp REPLACE_ME>") 
        .append("]>\n"); 

      String headerText = header.toString().replace("REPLACE_ME", "\"" + definition + "\""); 
      String wholeText = new StringBuffer(headerText).append(plainHtml).toString(); 

      TransformerFactory factory = TransformerFactory.newInstance(); 
      Source xslt = new StreamSource(new StringReader(transformation)); 
      Transformer transformer = factory.newTransformer(xslt); 
      Source text = new StreamSource(new StringReader(wholeText)); 
      transformer.transform(text, new StreamResult(result)); 
      retval = result.toString(); 
     } 
     catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 

     return retval; 
    } 
} 

Hier ist die Ausgabe von meinem Lauf meiner kleinen Beispielanwendung:

results in &nbsp being replaced by a space<html><head/> <body>)  <p data-tags="personal"><strong>ANONYMIZED TEXT</strong><br/></p>  <p><span>some text</span> </p><br/>some more text </body></html> 

----- 
results in seemingly non-replaced escape code &amp;<html><head/> <body>)  <p data-tags="personal"><strong>ANONYMIZED TEXT</strong><br/></p>  <p><span>some text</span>&amp;nbsp</p><br/>some more text </body></html> 

----- 
results in recursion exceptionjavax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Recursive entity reference "nbsp". (Reference path: nbsp -> nbsp -> nbsp), 
null 
ERROR: 'Recursive entity reference "nbsp". (Reference path: nbsp -> nbsp -> nbsp),' 
----- 
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Recursive entity reference "nbsp". (Reference path: nbsp -> nbsp -> nbsp),' 

also results in recursion exceptionERROR: 'Recursive entity reference "nbsp". (Reference path: nbsp -> nbsp -> nbsp),' 
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Recursive entity reference "nbsp". (Reference path: nbsp -> nbsp -> nbsp),' 
javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Recursive entity reference "nbsp". (Reference path: nbsp -> nbsp -> nbsp), 
null 

----- 

Der Unterschied zwischen den 4 Versuchen zu sein:

</span> </p><br/>some more text 

</span>&amp;nbsp</p><br/>some more text 

exception 

exception 
+0

"* Weil nbsp als ein Leerzeichen definiert wurde *" Sie zeigen 'nbsp' nicht als ein Leerzeichen, sondern als ein nichtbrechendes Leerzeichen an - und die Umwandlung sollte es beibehalten (es sei denn, Sie haben etwas in ein Leerzeichen übersetzt) ausdrücklich). Bitte schreiben Sie ein ** reproduzierbares ** Beispiel - siehe: [mcve] –

+0

Welche Version von XSLT verwenden Sie und welchen Prozessor verwenden Sie, um es zu verarbeiten? –

+0

@ michael.hor257k - ja, tut mir leid, ich habe meinen Beitrag jetzt mit dem aktualisiert was ich hoffe ein kurzes und minimal reproduzierbares Beispiel ist. – svaens

Antwort

1

Ich glaube, Sie haben hier zwei Möglichkeiten:

  1. Ändern Sie die Ausgabemethode zu html;
    Dies wird Ausgang jedes nicht-breaking Raum als &nbsp;

  2. Veränderung der Ausgangskodierung ASCII;
    Dies wird Ausgang jeder non-breaking Raum als &#160;


Hinweis: Wenn Sie die Ausgabe als xml und die Codierung als UTF-8, das serialisierte Ergebnis noch sollte verlassen umfassen ein unescaped schadloser Raum. Es kann etwas anderes in Ihrer Verarbeitungskette geben, das das verhindert - oder vielleicht verwechseln Sie den Charakter mit einem regulären Leerzeichen (schließlich werden sie in den meisten Fällen gleich dargestellt).