2011-01-26 7 views
0

저는 javax.xml.transform.Transformer과 XSLT를 사용하여 XML 문서를 변환 중입니다. 이 문서에는 "and"문자 (Java Integer Code 8220 및 8221)가 들어 있습니다. 이들은 일반적인 따옴표가 아닙니다.XSLT 문자로 변환 8221

문서를 변환 할 때이 문자는 “”으로 변환됩니다. 이제 내 고민은 이걸 사람들이 읽을 수있는 것으로 변환하는 방법입니까? 나는 utf-8, utf-16, ascii 등의 인코딩을 사용하여 DOMReaderSAXReader으로 문서를 읽으려고했다. 운이 없다.

귀하의 도움에 감사드립니다. 최대

+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 출력 방식 출력 할 수있다 문자 참조가있는 경우 출력에 메서드가 사용하는 HTML 버전이 정의되어 있습니다. "

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

+0

** ** may **의 사용에 유의하십시오. 사실, 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에 대한 직렬화의 경우에는 그렇지 않습니다. 이것이 첫 번째 대답에서 해결 방법을 제시하는 이유입니다.

그러나 이스케이프와 관련하여이 두 가지 방법의 차이는 "disable-output-escaping"특성 (XSLT 1.0)의 기본값입니다. XML 출력의 경우 "아니오"로 설정되고 HTML의 경우 "예"로 설정됩니다.

그래서 당신은 포함 할 수있는 몇 가지 값 "특별한"문자를 복사 할 때 당신은 다음처럼 작성할 수있는 전체 직렬화 방법을 변경하지 않고 문제를 해결하기 위해 :

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

P.S.을 이런 종류의 일을하기 위해 XSLT 2.0에서 선호하는 방법은 문자표 명령을 사용하는 것입니다.

+0

내 대답을주의 깊게 읽으십시오. UNICODE 코드 포인트입니다. 인코딩을 올바르게 선언해야합니다. –