我有一个XSLT样式表"我已经编译成一个样式表。使用xsltc.exe
DLL包含在我的。net 6 (<TargetFramework>net6.0</TargetFramework>
)项目中,使用方法如下:
var xslCompiledTransform = new XslCompiledTransform();
xslCompiledTransform.Load(typeof(Stylesheet));
// ↑ System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. The system cannot find the file specified.
xslCompiledTransform.Transform(@"......input.xml", @"......output.xml");
Load
方法抛出FileNotFoundException
并提示"无法加载文件或程序集"。SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089。系统找不到指定的文件。">
关于xsltc.exe的文档如下所示:
脚本块仅在。net框架中支持。它们不支持。net Core或。net 5或更高版本的。
这在很大程度上暗示了使用xsltc.exe编译的样式表应该在。net Core或。net 5或更高版本(当没有使用脚本块时)上工作,但在我的测试中它们没有。
有人知道为什么使用xsltc.exe编译的样式表不能与。net 6一起工作以及如何解决这个问题吗?
更多细节我在下面添加了更多的细节。
请注意,我使用的样式表Stylesheet.xsl
是非常基本的,没有使用特殊的功能:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<output>
<xsl:for-each select="input/book">
<booktitle>
<xsl:value-of select="@title" />
</booktitle>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
生成DLL的命令:
"C:Program Files (x86)Microsoft SDKsWindowsv10.0AbinNETFX 4.8 Toolsxsltc.exe" Stylesheet.xsl
在sdk风格的.csproj文件中引用DLL:
<ItemGroup>
<Reference Include="Stylesheet">
<HintPath>.Stylesheet.dll</HintPath>
</Reference>
</ItemGroup>
input.xml
:
<input>
<book title="First Title" />
<book title="Second Title" />
</input>
output.xml
当使用未编译的样式表执行转换时:
<output>
<booktitle>First Title</booktitle>
<booktitle>Second Title</booktitle>
</output>
我已经研究并发现其他人也有同样的问题,但还没有找到解决方案或解释为什么微软文档隐式地声明它应该工作,而在我的测试中却没有。
- https://github.com/dotnet/runtime/issues/68129
- 在。net Core 2.2中使用xsltc.exe生成程序集?
- XslCompiledTransform.Load(type): Could not load file or assembly 'System.Data.SqlXml
System.IO.FileNotFoundException
的堆栈跟踪:
at System.Delegate.BindToMethodInfo(Object target, IRuntimeMethodInfo method, RuntimeType methodType, DelegateBindingFlags flags)
at System.Reflection.RuntimeMethodInfo.CreateDelegateInternal(Type delegateType, Object firstArgument, DelegateBindingFlags bindingFlags)
at System.Reflection.RuntimeMethodInfo.CreateDelegate(Type delegateType)
at System.Xml.Xsl.XslCompiledTransform.Load(MethodInfo executeMethod, Byte[] queryData, Type[] earlyBoundTypes)
at System.Xml.Xsl.XslCompiledTransform.Load(Type compiledStylesheet)
at TestXslDotnet6.Program.Main(String[] args) in C:UsersUserNameRedactedPathToRepoTestXslDotnet6TestXslDotnet6Program.cs:line 10
根据GitHub问题中的信息。net 6不支持XslCompiledTransform.Load(type(myXsltCompiled_dll)),看起来好像不支持,也不会支持。
2022年4月18日的评论说:
程序集System.Data.SqlXml包含命名空间System.Xml.Xsl。
根据移植指南,msxsl:script在。net Core上不可用。. net框架特定的教程预计无法工作。
第二个人评论:
看起来System.Data.SqlXml是SQLXML的一部分SQL Server org和据我所知不支持。net Core。
第三个人回答:
目前没有关于SQLXML和。net 5+支持的计划,我们还没有听到很多这方面的要求。我将我建议在这里打开一个用户的声音来获得一些牵引力主题共识:https://aka.ms/sqlfeedback
所以,这就是你的答案:"msxsl:script在。net Core上不可用。.NET框架特定的教程预计不会起作用。原因是一个非。NET小组将不得不使它成为可能,但没有计划。他们感觉不到需求。
并且,他们承认文档具有误导性。似乎在2022年5月对文档进行了更改,并创建了一个pull请求:注意XSLT脚本块仅适用于。net框架。
我认识到这并没有为你提供解决方案或前进的道路,这是令人失望的。但这就是你问题的答案:在。net 6.0中不支持以这种方式进行转换。