두 개의 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가 아닌 이름으로 어셈블리를 호출하도록하고, 임시 폴더에 없으므로 호출이 실패한다고 생각한다.
왜 그렇습니까? 절대 경로가 어디서 왜 왜 상대 경로로 변환 될 수 있습니까? 어떻게 제어합니까?
C#/vb 코드에서 xslt를 실행 하시겠습니까? 또는 당신은 그냥 똑바로 xslt을 실행하고 있습니다.코드에서 변환을 실행하기 전에 xslt 및 네임 스페이스를로드하는 방법을 게시하십시오. –
내가 말했듯이 "VS2008 XSLT 디버거로갑니다." 즉, Visual Studio에서 XSL을 열고 Debug XSLT를 클릭합니다. :) – GSerg