2013-03-06 2 views
2

는이 XML 요소를 표현하는 '기호보다'고XSLT 탈출 비는 XSLT 1.0에서

<Product>This is a product. &lt; and its price is < 10</Product> 

공지 사항을 처리하는 가장 좋은 방법은 무엇입니까 문자 (<및 <)을 탈출 두번. 즉 '&lt;' and '<'.

으로 내가 할 수있는 < 문자를 탈출하려면이

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" method="html" indent="yes" /> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <table border="1"> 
     <tr> 
     <th>Product</th> 
     </tr> 
     <tr> 
     <td><xsl:value-of select="Product" disable-output-escaping="yes" /></td> 
     </tr> 
    </table> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 
내가 해제 출력 - 탈출 "예" < 문자가 올바르게 표시로 설정하면
  • 하지만 "&lt;"은 완전히 제거한다 .
  • disable-output-escaping을 "no"로 설정하면 < 문자로 인해 구문 분석 예외가 발생합니다.

둘 모두 허용하려면 어떻게해야합니까?

+6

마술에 의해서만, 그리고 흰색보다는 오히려 검은 색입니다. 올바른 형식의 XML 만 사용하십시오. – kan

+3

@kan이 말하는 것은'<'는 XML의 유효한 텍스트 내용이 아닙니다. –

+2

해당 XML이 유효하지 않습니다 (또는 잘 구성된 경우). XML *은 파싱 된 문자 데이터 안에'<'(또는 ''또는'< '또는 그 이상)으로 이스케이프 처리되어야한다는 것을 * 요구합니다. (일부 SGML 응용 프로그램과 달리 XML에는 순수 문자 데이터 콘텐츠가있는 요소 개념이 없습니다. – ruakh

답변

-1

첫 번째 방법 (disable-output-escaping="yes")이 유일한 방법이라고 생각합니다. 그렇지 않으면 오류가 발생합니다. 그렇게 할 수는 없습니다.

엔티티 해결 (&lt;이 확인되고 대체 됨)을 방지 (또는 패치)하는 방법을 찾아야합니다.

+0

downvote 이유는 무엇입니까? – gaborsch

+1

아마도 제안 된 솔루션이 작동하지 않기 때문입니다. disable-output-escaping은 잘못된 형식의 XML을 마술처럼 분석 할 수는 없습니다. –

+0

@MichaelKay 답변 해 주셔서 감사합니다.하지만 오해가 있습니다. 제안 된 해결책은'disable-output-escaping = "yes"지시문을 사용하면서 해결하는 엔티티를 패치하는 것이 었습니다. 나는 OP가 XML을 어떻게 든 깔끔하게 정리해야한다는 것을 알고 있습니다. 그 XML은 조작 된 XML이기 때문에 가능하지만 불가능하다면이 해결 방법으로 XML을 수정할 수 있습니다. – gaborsch

3

전체적으로 XSLT 1.0에서 입력을 처리하는 가장 좋은 방법은 입력을 XML로 변환 한 다음 정상적으로 처리하는 것입니다. XML이 아닌 입력에 직면했을 때의 XSLT 프로세서의 동작은 엉뚱한 경향이 있습니다.

1

단순한 대답은 (다른 사람들이 언급했지만 직접 말하지 않은 것처럼) 입력이 XML이 아니라는 것입니다. XSLT는 단순히 입력에 대해 작동하지 않습니다. 사전 처리해야하거나 그렇지 않으면 어떤 시스템을 수정하여 고정되어 있으므로 과 같은 실제 XML이 생성됩니다. XML!