2016-05-04 13 views
0

XSLで変換する必要があるHTML文書があります。 HTML文書は が定義されていなかったため、すなわち、nbspを文字列 " "として定義するENTITYを宣言する

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

は、第一に、私はトラブルを持っていた&nbsp; の使用を含んでいます。 だから私はそれを定義した:

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

私は変態に送信する前にHTML文字列にそのコードを付加することでそのようにしました。変換後、ENTITY宣言は都合のいいものになりました。

ただし、 nbspはスペースとして定義されていたため、生成されたHTML/XMLは文字列"&nbsp;"を実際にスペース文字で置き換えました。

これは私が欲しいものではありません。結果のその部分がソースと異なることがないようにする必要があります。

だから、私はそうのように、NBSPを再定義しようとした:

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

をしかし、今、代わりに私の結果で空間を、私は文字が"&amp;nbsp;"

私はこれをしようとすると表示さ

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

再帰的な宣言例外が発生します。

どのように特殊文字 '&'を定義に含めることができますか?

p.s.この変換はJava 8で実行されています(デフォルトではxalanですか?)。

ありがとうございます!

以下は、再生方法の簡単な例です。それ以前に申し訳ありません。ここで


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; 
    } 
} 

私の小さなサンプルアプリケーションの私の実行からの出力です:

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 

----- 

ている4回の試行との違い:

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

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

exception 

exception 
+0

"* nbspはスペースとして定義されているため、"スペースではなく、改行しないスペースとして定義された "nbsp"を表示します。変換ではスペースを変換しない限り明示的に)。 **再現可能な**例を投稿してください - [mcve] –

+0

どのXSLTのバージョンを使用していますか、どのプロセッサを使って処理していますか? –

+0

@ michael.hor257k - はい、申し訳ありませんが、私は今私の投稿を更新しました。 – svaens

答えて

1

私は信じていますここには2つのオプションがあります:

  1. 出力方法をhtmlに変更します。
    この意志出力&nbsp;

  2. 変更ASCIIへの出力エンコーディングとして任意の非改行スペース。
    この意志の出力は&#160;


として任意の改行なしスペース注:あなたはUTF-8としてxmlとして出力方法およびエンコーディングを残す場合は、シリアル化された結果はまだエスケープを含める必要があります非破壊空間あなたの処理チェーンには、それが起こるのを防ぐ何かがあるかもしれません。あるいは、あなたは通常のスペースのキャラクターを間違っているかもしれません(結局のところ、ほとんどの場合同じようにレンダリングされます)。

関連する問題