를 해결하는 방법은 무엇입니까 <xsl:import> 고 <xsl:include> 요소로 상대 경로를 사용하는 경우 xsltc.exe XslCompiledTransforms?

StackOverflow https://stackoverflow.com/questions/8991755

  •  13-11-2019
  •  | 
  •  

문제

의 일환으로 당사 웹 응용 프로그램의 빌드 프로세스,나는 설정의 XSLT stylesheets 을 내장 Microsoft xsltc.exe 컴파일러할 때마다 우리는 실행하는 전체를 컴파일.하는 동안 지역 개발에 이것은 좋은 일로 코드를 컴파일 및 호스팅에서 동일한 위치에 있습니다.그러나,일단 이 빌드 서버에서 문제가 발생했다.

빌드 서버에 컴파일 XSLT stylesheets 처럼 나는 로컬로,하지만 스크립트를 실행를 배포하는 코드를 컴파일하면서 우리의 내부 staging 웹 서버에 있습니다.일단 이러한 바이너리 이사에서 그들이 컴파일되면,상대적인 경로에서 <xsl:import><xsl:include> 요소를 더 이상 해결,올바르게 일으키는 예외는 다음과 같이 때 XSLT stylesheets 를 실행하고 있습니다.

Could not find a part of the path 'e:\{PATH}\xslt\docbook\VERSION'.
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
    at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
    at System.Xml.Xsl.Runtime.XmlQueryContext.GetDataSource(String uriRelative, String uriBase)

여기에 일반적인 코드의 아이디어를 그대로 지금:

var xslt = new XslCompiledTransform();
xslt.Load(typeof(Namespace.XslTransforms.CompiledXsltStylesheet));
xslt.Transform("input.xml", "output.xml");

지금 사용하고 XslCompiledTransform.부하()메소드와 함께 하나의'유형'매개변수를 가져올 xsltc.exe-을 기반으로 미리 컴파일 XSLT stylesheets.내가 말할 수 있는 스택에서는 추적니다.NET 프레임워크가 사용하여 XmlUrlResolver 를 해결하의 실제 위치에서 이러한 외부 스타일 시트,하지만 나는 볼 수 없는 방법을 제공하는 재정의의 구현 xmlresolver 속성할 수 있는 전달에서 새로운 baseUri 는 점이 이러한 스타일 라이브 웹 서버에 있습니다.

나는 가정이 문제를 해결할 수 있습으로 더 이상 미리 컴파일 xsltc.exe 선적 및 XSLT stylesheets 을 통해 XmlReaders,이런스를 유지하도록 도와드립니다.사용 다른 XslCompiledTransform.부하()메서드 는 매개 변수가 있는 곳에 나가를 제공할 수 있는 내 자신의 xmlresolver 속성을 구현합니다.그러나 내가 미리 컴파일 옵션에 대한 구문을 검증하고 성능을 가지고,그래서 나는 원하지 않는다 그것을 포기하지 않는 한 나는 절대적으로 한다.

가 사용하는 방법 xsltc.exe 를 미리 컴파일러 XSLT stylesheets,아직 제공하는 방법을 명시적으로 baseUri 에 대한 상대적인 경로의 해상도 <xsl:include><xsl:import> 소에서 런타임?

도움이 되었습니까?

해결책

후에 의 놀이,내가 이었다는 것을 발견된 오른쪽의 코드가 제공하는 자동으로 사용 시스템입니다.Xml.XmlUrlResolver 를 해결하 <xsl:include><xsl:import> 상대 경로에서 실행시간.그러나 사용하의 XmlUrlResolver 지 시스템입니다.Xml.XslCompiledTransform 배치된 경우에는 이진로 xsltc.exe. Xmlresolver 속성이 실제로 선택 Xmlresolver 속성 숙박 시설에 시스템입니다.Xml.XmlReaderSettings시스템입니다.Xml.형식화된 데이터 읽기 는 변형을 수행합니다. 한번 나 자신의 사용자 정의 xmlresolver 속성에 XsltReaderSettings 사용할 수 있었을 제어하는 상대 경로로 해상도입니다.

를 재정의하려는 경우 이 xmlresolver 속성으로 내가 그랬어,다음과 같은 코드를 사용할 수 있습니다 가이드:

var customXmlResolver = new SomeCustomXmlResolver();  // Derives from XmlResolver
var xmlReaderSettings = new XmlReaderSettings {
  XmlResolver = customXmlResolver
};

var xslt = new XslCompiledTransform();
xslt.Load(typeof(Namespace.XslTransforms.CompiledXsltStylesheet));

using (var xmlReader = XmlReader.Create("input.xml", xmlReaderSettings)) {
  using (var xmlWriter = XmlWriter.Create("output.xml")) {
    xslt.Transform(xmlReader, null, xmlWriter, customXmlResolver);
  }
}

나는 여전히 사용 xsltc.exe 를 컴파일하는 내 XSLT stylesheets,하지만 내가 짐이 컴파일된 스타일 시트 웹 서버에 삽입된 SomeCustomXmlResolver 다시 작성에 있는 경로를 재정의 ResolveUri()GetEntity() 방법도록 참조하는 파일에서 살 <xsl:include><xsl:import>기반의 상대적인 경로를 찾을 수 있습니다.으로 추가 보너스에 추가하여 같은 xmlresolver 속성을의 끝에 Transform() 방법 document() operations XML 것입니다 또한 그들의 상대적인 경로 해결되었습니다.

다른 팁

가 사용하는 방법 xsltc.exe 를 미리 컴파일러 XSLT stylesheets, 아직 제공하는 방법을 명시적으로 baseUri 상대 경로를 해결책의 <xsl:include><xsl:import> 소에서 런타임?

을 사용하려고:

XslCompiledTransform.CompileToType()

인수 중 하나는 정적 방법을 허가:

XmlResolver stylesheetResolver

이것이 당신의 시스템을 해제하는지 모르지만, 대신에 어때?

  1. xsltc.exe 컴파일
  2. 바이너리 배포
  3. Load() 로 바이너리로드

    You

    1. 스타일 시트를 배포하지만 import/include 지시문 에 많은 사람들이 필요합니다.
    2. 주요 스타일 시트를 Load() import/incldue

      적어도 런타임에 적어도 "컴파일 된"스타일 시트의 이점을 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top