2010-01-15 7 views
3

두 개의 XSL 파일이 있습니다. 하나는 <xsl:include>을 사용하는 다른 하나를 포함합니다. 기본 템플리트는 노드 값에 따라 호출 할 실제 템플리트를 결정하고 포함 된 템플리트에는 실제 변환 규칙이 들어 있습니다. 여기에는 특별한 것이 없습니다.참조 된 XSL 템플릿에서 스크립팅을위한 어셈블리 사용

<msxsl:script language="VB" implements-prefix="user"> 
    <msxsl:assembly href="C:\Absolute\Path\MyEscaper.dll" /> 
    <msxsl:using namespace="ZebraEscaper.MyCompany" /> 
    <![CDATA[ 
    Public Function escape(s As String) As String 
     Return EncodeField(s, True) 
    End Function 
    ]]> 
    </msxsl:script> 

사용자 : 탈출() 함수가 나중에 포함 된 템플릿에 사용되는

그러나 포함 된 파일은 스크립트 블록을 가지고있다.

이제 VS2008 XSLT 디버거로갑니다.

주 템플릿은 <xsl:apply-templates>을 호출하고 포함 된 템플릿을 실행합니다. FileNotFound 예외가 발생합니다. "MyEscaper, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null"또는 해당 종속성 중 하나를로드 할 수 없습니다. 시스템에서 지정한 파일을 찾을 수 없습니다. "

이제 포함 된 파일로 이동하여 독립 실행 형 템플릿 인 것처럼 실행하면 아무 것도 포함되지 않고 모든 것이 작동합니다. 어셈블리가 발견되고 함수가 호출되지만 템플릿이 포함되도록 설계된 결과는 분명히 의미가 없습니다.

질문 - 왜 템플릿이 포함되어있을 때 시스템에서 어셈블리를 찾을 수 없습니까?

더 많은 정보

문서는 "조립 경로 이름이 두 번 해결됩니다. - 컴파일시 한 번 실행 중에 한 번"고 주장한다 의도적으로 경로에서 오타를 만들면 동일한 FileNotFound 예외가 발생하지만 시스템에서 파일 (예 : // C : \ Absolute \ Path \ MyEscaper.dll)을 찾을 수 없다고 나와있는 경우 다르게 형식이 지정됩니다. 그러나 경로가 올 바르면 예외가 MyEscaper.dll, version = blabla, public token = null을 찾을 수 없다고 주장하며 예외는 .NET에서 만든 CompiledStylesheet.dll에서 발생합니다. 나는 컴파일 된 스타일 시트가 href가 아닌 이름으로 어셈블리를 호출하도록하고, 임시 폴더에 없으므로 호출이 실패한다고 생각한다.

왜 그렇습니까? 절대 경로가 어디서 왜 왜 상대 경로로 변환 될 수 있습니까? 어떻게 제어합니까?

+0

C#/vb 코드에서 xslt를 실행 하시겠습니까? 또는 당신은 그냥 똑바로 xslt을 실행하고 있습니다.코드에서 변환을 실행하기 전에 xslt 및 네임 스페이스를로드하는 방법을 게시하십시오. –

+0

내가 말했듯이 "VS2008 XSLT 디버거로갑니다." 즉, Visual Studio에서 XSL을 열고 Debug XSLT를 클릭합니다. :) – GSerg

답변

3

So.

포함 된 시나리오에서 어셈블리로의 경로는 컴파일 및 실행 중에 다르게 해결됩니다. 왜 그렇게, 나는 단서가 없다.

만이 제정신이 솔루션은 발견 :

  1. 이동합니다 XSL 템플릿에 참조 된 어셈블리의 모든 코드, 그것을 포함 된 스크립트를 만드는. 작은 도우미 기능이 실제로 선호됩니다. 그렇지 않으면

  2. 강한 이름으로 서명 한 어셈블리를 GAC에 추가하고 name이 아닌 href을 사용하여 템플릿에서 참조하십시오. 이렇게하면 어셈블리가 컴파일 및 실행 중에 동일한 방식으로 조회되어 발견 될 것입니다.