2010-02-02 3 views
7

XSLT를 사용하여 간단한 XML 스키마를 HTML로 변환하려고 시도하고 fn:replace를 사용하여 <p>;로 반품 (\n)을 대체 할 계획입니다. 그러나이 함수를 올바르게 사용하는 방법을 알 수 없습니다.XPath 함수 사용 fn : XSLT에서 바꾸기

사용하고있는 XSLT의 간략한 버전은 다음과 같습니다.

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:template match="/root"> 
    <html> 
     <body> 
     <!-- Replace \n with <p> --> 
     <xsl:value-of select="fn:replace(value, '\n', '<p>')" /> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

그리고이 XLST의 입력은 다음과 같습니다.

<?xml version="1.0"?> 

<root> 
    <value><![CDATA[ 
    Hello 
    world! 
    ]]></value> 
</root> 

NoSuchMethodException을 사용하여 fn:replace에서 변환이 실패합니다.

<xsl:value-of select="fn:replace('somestring', '\n', '<p>')" /> 

바꾸기 문을 변경하면 IllegalArgumentException이 발생합니다. 내가 원하는 것을 얻기 위해 fn:replace를 어떻게 사용합니까?

XSLT를 테스트하기 위해 Butterfly XML Editor을 사용하고 있습니다.

답변

7

XPath 2.0에는 Saxon 9 또는 AltovaXML 도구 또는 Gestalt와 같은 모든 XSLT 2.0 프로세서에서 사용할 수있는 바꾸기 기능이 있습니다. XSLT 1.0 프로세서에서이 함수를 사용하려고 시도하는 것 같습니다. 작동하지 않을 것입니다. XSLT 1.0 프로세서로 제한된 경우 이름이 지정된 재귀 템플릿 또는 확장 기능을 사용하여 대체를 구현해야합니다.

XSLT 2.0에서도 'p'태그 마크 업이있는 텍스트 노드를 생성하므로 replace에 사용하려는 시도가 잘못되었습니다. 결과에 'p'요소 노드를 만들고 싶다고 가정합니다. 따라서 XSLT 2.0을 사용하더라도 replace 대신 analyze-string을 사용하면 원하는 결과를 얻을 수 있습니다. 2.0 <xsl:stylesheet>의 버전 속성 범핑 및 사용하여

+1

Thx, XSLT 2.0을 언급하면 ​​올바른 방향으로 나를 밀어 냈습니다. 의 버전 속성을 부딪 히면됩니다. 2.0으로 변경하고 ; 나는 일을 끝내. 어쩌면 analyze-string은 더 깨끗합니다. 그러나 이것으로 작업이 완료됩니다 :) – larsmoa

+1

버전을 2.0으로 변경하는 것 외에 다른 작업을 수행 했습니까? –

+0

의 버전 속성을 2.0으로 변경하는 방법을 알려주시겠습니까? –

0

<xsl:value-of select="replace(description, '\n', '<p/>')" disable-output-escaping="yes" />

나는 교체 작업을 할 수 있었다.

+0

의 버전 속성을 2.0으로 변경하는 방법을 알려주시겠습니까? –

+0

@JatinPatel :'' – larsmoa