Asp.net 解析为IIS.exe的XSLT document()相对路径

Asp.net 解析为IIS.exe的XSLT document()相对路径,asp.net,xslt,iis,asp.net-web-api,Asp.net,Xslt,Iis,Asp.net Web Api,我有一个带有两个文件的.NETWebAPI项目,这两个文件都被标记为嵌入式资源,并与应用程序一起部署。这些文件也位于已部署应用程序的同一目录中: ./xsl/transform.xslt ./xsl/schema.xsd xslt文件需要通过document()函数加载xsd文件: <xsl:template match="*[not(local-name() = document('schema.xsd')//xs:element/@name)]" /> <xsl:te

我有一个带有两个文件的.NETWebAPI项目,这两个文件都被标记为嵌入式资源,并与应用程序一起部署。这些文件也位于已部署应用程序的同一目录中:

  • ./xsl/transform.xslt
  • ./xsl/schema.xsd
xslt文件需要通过document()函数加载xsd文件:

<xsl:template match="*[not(local-name() = document('schema.xsd')//xs:element/@name)]" />

<xsl:template match="@*[not(local-name() = document('schema.xsd')//xs:attribute/@name)]" />
我不想在这里使用绝对路径,因为我不想过度依赖应用程序部署到的环境。是否存在强制相对路径源来自transform.xslt在运行时部署到的同一目录

作为参考,运行时xslt文件的绝对路径为:

 C:\\MyFolder\\MyCode\\MyProject\\Web\\bin\\xsl\\transform.xslt
编辑: 根据请求,下面(大致)是用于从清单资源流加载xslt并运行转换的代码。这段代码是从几个不同的定制包中解包出来的,可以将其分解为核心库,因此不必担心流管理。我保证真正的代码更安全:

XmlReader input = this.GetInput();
Stream ouput = new MemoryStream(4096);

Stream stream = typeof(ClassUsingTransform).Assembly.GetManifestResourceStream("transform.xslt");
MemoryStream mStream = new MemoryStream(stream.ToByteArray());
var navigator = new XPathDocument(mStream).CreateNavigator();
XslCompiledTransform processor = new XslCompiledTransform();
processor.Load(navigator, XsltSettings.TrustedXslt, new XmlUrlResolver());
processor.Transform(input, new XsltArgumentList(), output);
XmlUrlResolver无法轻松展开为内置文件,但使用的类型继承自XmlUrlResolver,并且似乎没有修改任何内置设置。在派生类中完成的大部分工作似乎都集中在性能优化上。如果有人认为这里的实现很重要,我可以尝试更好地打开该类


所使用的XsltArgumentList也是一个派生类型,但据我所知,参数列表是空的。

是否需要用VB或C编写代码?使用xslcomiledtransform执行XSLT转换?如果是,请显示该代码,以及它如何加载样式表。@MartinHonnen Done。不管怎样,只要我能第一次通过就好了。如前所述,调用代码不是我自己写的。它包装在一些私人定制包中。如果您需要有关解析器或参数列表的更多详细信息,请告诉我,如果您从流中加载,那么XML解析器以及XSLT处理器没有基本URI来解析相对URI。此外,您似乎希望从资源加载辅助XML文档,我认为您需要传入一个知道如何执行此操作的自定义解析器。因此,基本上您需要使用一个类来为XmlUrlResolver创建子类,然后该类实现将相对URI解析为程序集中的资源。将转换作为嵌入式资源加载将破坏计算相对路径的能力是有道理的。我将看看是否可以将该文件作为“内容”包含,并使其以这种方式工作。
XmlReader input = this.GetInput();
Stream ouput = new MemoryStream(4096);

Stream stream = typeof(ClassUsingTransform).Assembly.GetManifestResourceStream("transform.xslt");
MemoryStream mStream = new MemoryStream(stream.ToByteArray());
var navigator = new XPathDocument(mStream).CreateNavigator();
XslCompiledTransform processor = new XslCompiledTransform();
processor.Load(navigator, XsltSettings.TrustedXslt, new XmlUrlResolver());
processor.Transform(input, new XsltArgumentList(), output);