2011-01-27 3 views
3

문서에서 알 수 있듯이 매개 변수로 빈 문자열이있는 XSLT 함수 document()는 현재 XSLT 문서를 읽어야합니다. 그러나 다음 코드는 작동하지 않습니다XSLT 문서 ('') 함수가 작동하지 않습니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <state>test2</state> 
    <xsl:template match="/"> 
     test1 
     <xsl:value-of select="document('')/*/state"/> 
    </xsl:template> 
    </xsl:stylesheet> 

내가 (단지 예를 들어) 일부 XML이 XSLT를 적용 할 때, 난 단지 "TEST1"가 출력으로. 왜 라인이

<xsl:value-of select="document('')/*/state"/> 

"test2"가 인쇄되지 않는 이유는 무엇입니까?

+0

변환을 어떻게 실행하고 있습니까? –

+0

이 저에게 효과적입니다. Eclipse XSL Transformer를 실행할 때'test1'과'test2'를 모두 얻습니다. – dogbane

+0

Windows에서 MSXML 라이브러리를 사용하는 경우 문서 함수를 사용하도록 설정해야 할 수 있습니다. 'styledocument.setProperty ("AllowDocumentFunction", true);'http://msdn.microsoft.com/en-us/library/ us/library/ms256465.aspx –

답변

9

문서 ('')의 정의는 문서 (') 호출이 들어있는 스타일 시트의 URI가 지침의 기본 URI와 동일한 XML 문서를 읽는 것입니다. 외부 엔티티를 사용하지 않는 한, 이것은 일반적으로 스타일 시트 모듈의 기본 URI와 동일합니다. 작동하지 않는다면 스타일 시트 모듈의 기본 URI를 알 수 없기 때문입니다. XSLT 프로세서에 URI를 통해 검색된 리소스가 아닌 메모리에있는 스타일 시트 (예 : 문자열 또는 DOM)가 있으면 쉽게 발생할 수 있습니다. 예를 들어, JAXP StreamSource를 사용하고 setSystemId()를 호출하지 않으면 기본 URI를 알 수 없습니다.

+0

네가 맞아, 고마워! setSystemId() 내 경우에 도움이 – Mikhail

+0

+1 좋은 답변. 또한'document()'함수가 어떤 권한 수준에서는 허용되지 않는 환경이 있습니다. –

1

이 같은 자신의 네임 스페이스를 선언해야합니다 :

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="http://localhost" 
    exclude-result-prefixes="my"> 
    <xsl:output method="text"/> 

    <my:state>test2</my:state> 

    <xsl:template match="/"> 
     <xsl:text>test1</xsl:text> 
     <xsl:value-of select="document('')/*/my:state"/> 
    </xsl:template> 
</xsl:stylesheet> 

OUPUT을 :

test1test2 

인용 마이클 케이 :

사용자 정의 최상위 요소가 을해야합니다 또한 XSLT와 다른 null이 아닌 URI가있는 네임 스페이스에 속합니다.네임 스페이스이고 다른 공급 업체에서 사용하는 네임 스페이스 URI의 다른 이 아닌 것이 좋습니다. 이러한 요소는 XSLT 프로세서 에 의해 무시됩니다.

+0

은 여전히 ​​Java 6에서 작동하지 않습니다 (xalan 사용). 하지만 어쨌든 덕분에, XSL 프로세서의 사용 된 버전은 특별한 구문이 필요합니다. – Mikhail

+1

+1 구문 오류가 있습니다. 또한, [specs] (http://www.w3.org/TR/xslt#stylesheet-element)를 인용 할 수 있습니다 : * "또한, xsl : stylesheet 요소는 XSLT 네임 스페이스가 아닌 요소를 포함 할 수 있습니다 단 요소의 확장 이름에 null이 아닌 네임 스페이스 URI가 있어야합니다. "* –

관련 문제