2011-01-26 4 views
0

javax.xml.transform.TransformerとXSLTを使用してXML文書を変換しています。この文書には、文字「and」(Java Integer Code 8220および8221)が含まれています。これらは通常の引用符ではありません。XSLTによる文字変換8221

文書を変換すると、これらの文字は“”に変換されました。私の苦労は、これらを人々が読むことのできるものに変換する方法です。私はDOMReaderSAXReaderで、utf-8、utf-16、asciiなどのエンコーディングを使ってこの文書を読んでみました。

ご協力いただきありがとうございます。

+0

入力文字に一致する出力文字はありますか?私は違いが見えません。これがStackoverflowでのプレゼンテーション/エンコーディングの問題である場合は、コードの書式設定ボタンを使用して文字をエスケープしてください。 –

答えて

0

utf-8文字201cおよび201dです。 HTMLに変換していますか? XSLTの仕様からhttp://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references 引用::そうと、あなたのXSLTは、HTML出力を指定した場合、彼らは文字実体参照をしているように私は、出力&ldquo&rldquoにそれを期待する

「html出力方法を出力してもよい 文字 のリファレンスを使用して、 の出力に メソッドが使用しているバージョンを定義している場合は、その文字エンティティを使用します。

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

+0

**の使用に注意してください**。実際、Xalanだけが '' 'と' ''に対してそれを行います。 –

+0

@Alejandro - 私はそれに気付きましたが、それはそれがXalanだけであったことを知らなかった、ありがとう。 –

0

この入力:

<p> “ and ” </p> 

このスタイルシート(単にアイデンティティルール)の場合:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

出力:

<p> “ and ” </p> 

のみhtmlシリアライズ方法、出力でのXalan:あなたは正しいrenderizationをしたいのであれば

<p> &ldquo; and &rdquo; </p> 

は、あなたが出力に適切なHTML文書を必要とする...

このスタイルシート:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="utf-8"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Test</title> 
      </head> 
      <body> 
       <xsl:apply-templates/> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

出力:

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
     <title>Test</title> 
    </head> 
    <body> 
     <p> “ and ” </p> 
    </body> 
</html> 

:適切なcharsetエンコーディング宣言。

0

XSL変換はXML文書そのものに適用されるのではなく、この文書のツリー表現に適用されることを理解する必要があります。テキストノードには、入力文書でどのように表現されたかにかかわらず、特定のエンコーディングの値が含まれています。ツリーの作成後は同じです。変換中に、別のツリーを作成してからシリアル化します。

あなたが言及したようなキャラクターの中には、あなたが選んだ目的地のフォーマットに応じて特別扱いが必要なものもあります。 XML文書へのシリアライズの場合、それらは「エスケープ」され、HTMLへのシリアライズの場合、それらはHTMLにはなりません。これが最初の答えがあなたに回避策を与える理由です。

エスケープに関するこれらの2つの方法の違いは、「無効出力エスケープ」属性(XSLT 1.0)のデフォルト値です。 XML出力の場合は「いいえ」に設定され、HTMLの場合は「はい」に設定されます。あなたは「特別な」文字が含まれているかもしれないいくつかの値をコピーしているときにこのような何かを書くことができ、全体のシリアル化方法を変更することなく、あなたの問題を解決するために、そう

<xsl:value-of select="/my/node/text()" disable-output-escaping="yes"/> 

P.S.この種のことを行うためのXSLT 2.0の好ましい方法は、文字マップ命令を使用することです。

+0

私の答えをよく読んでください。これらはUNICODEコードポイントです。エンコーディングを正しく宣言する必要があります。 –