XSLで変換する必要があるHTML文書があります。 HTML文書は が定義されていなかったため、すなわち、nbspを文字列 " "として定義するENTITYを宣言する
ation.</span> </p><br/>All ...
は、第一に、私はトラブルを持っていた
の使用を含んでいます。 だから私はそれを定義した:
<?xml version=\"1.0\"?>
<!DOCTYPE html [
<!ENTITY nbsp " ">
"]>
私は変態に送信する前にHTML文字列にそのコードを付加することでそのようにしました。変換後、ENTITY宣言は都合のいいものになりました。
ただし、 nbspはスペースとして定義されていたため、生成されたHTML/XMLは文字列" "
を実際にスペース文字で置き換えました。
これは私が欲しいものではありません。結果のその部分がソースと異なることがないようにする必要があります。
だから、私はそうのように、NBSPを再定義しようとした:
:<?xml version=\"1.0\"?>
<!DOCTYPE html [
<!ENTITY nbsp "&nbsp;">
"]>
をしかし、今、代わりに私の結果で空間を、私は文字が"&nbsp;"
私はこれをしようとすると表示さ
<?xml version=\"1.0\"?>
<!DOCTYPE html [
<!ENTITY 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> </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   being replaced by a space
printResult("results in   being replaced by a space", plainHtml," ", transformation);
// results in seemingly non-replaced escape code &
printResult("results in seemingly non-replaced escape code &", plainHtml,"&nbsp", transformation);
// results in recursion exception
printResult("results in recursion exception", plainHtml," ", transformation);
// also results in recursion exception
printResult("also results in recursion exception", plainHtml,"&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> </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   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 &<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>
-----
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>&nbsp</p><br/>some more text
exception
exception
"* nbspはスペースとして定義されているため、"スペースではなく、改行しないスペースとして定義された "nbsp"を表示します。変換ではスペースを変換しない限り明示的に)。 **再現可能な**例を投稿してください - [mcve] –
どのXSLTのバージョンを使用していますか、どのプロセッサを使って処理していますか? –
@ michael.hor257k - はい、申し訳ありませんが、私は今私の投稿を更新しました。 – svaens