c# - C# 中的 XSLT 转换 - 如何获取包含文档的有效 URL?
问题描述
我正在使用 XSLT 表转换 XML。该工作表由几个文件组成,包括如下:
<xsl:include href="tokens.xsl"/>
<xsl:include href="glayout.xsl"/>
<xsl:include href="scripts.xsl"/>
<xsl:include href="tables.xsl"/>
<xsl:include href="entities.xsl"/>
<xsl:include href="cmarkup.xsl"/>
转换代码如下所示:
// Load text
var reader = XmlReader.Create(new StringReader(text));
// Load transform
XslCompiledTransform myXslTrans = new XslCompiledTransform();
using (var fs = new FileStream(result.FileName, FileMode.Open, FileAccess.Read))
{
var xmlReader = XmlReader.Create(fs);
myXslTrans.Load(xmlReader);
}
// Perform transformation
MemoryStream ms = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(ms, Encoding.UTF8);
myXslTrans.Transform(reader, null, writer);
// Recover result to string
ms.Seek(0, SeekOrigin.Begin);
var textReader = new StreamReader(ms);
string transformed = textReader.ReadToEnd();
包含行上的转换失败。我发现,我可以提供自己的解析器来提供丢失的文档,但由于它们的 URL 是相对的,我将它们附加到当前应用程序的文件夹中,例如:
D:\Dokumenty\Dev\VS\Dev.Editor\Dev.Editor\bin\Debug\tokens.xsl
有两种肮脏的解决方案:
- 切断应用程序路径以仅检索文件名,然后在原始工作表的文件夹中搜索文件(但如果文件有一个子文件夹,例如:
Include/tokens.xsl
? - 暂时将当前目录设置为主工作表所在的目录:
var dir = System.IO.Directory.GetCurrentDirectory();
try
{
System.IO.Directory.SetCurrentDirectory(System.IO.Path.GetDirectoryName(result.FileName));
myXslTrans.Load(xmlReader, null, resolver);
}
finally
{
System.IO.Directory.SetCurrentDirectory(dir);
}
但我也不喜欢这个解决方案。有没有办法强制将XslCompiledTransform
原始 URL 传递给解析器?或者可能是这个问题的其他更通用的解决方案?
解决方案
如果您有一个带有主样式表模块的文件名或 URI,则使用采用Load
字符串的方法的重载 ( https://docs.microsoft.com/en-us/dotnet/api/system.xml.xsl.xslcompiledtransform。 load?view=netframework-4.8#System_Xml_Xsl_XslCompiledTransform_Load_System_String_ ) 与例如myXslTrans.Load(result.FileName)
。
推荐阅读
- css - Bootstrap layout - responsive rows and columns order
- c# - Problem with drag-and-drop WPF. Dragging button as ListBoxItem leaves blank field
- json - 将 XML 文件转换为 JSON
- ssh - 在 VMvare Workstation 中运行 Mininet 的 SSH 权限被拒绝
- javascript - 使用 GDB 调试 Firefox 构建时在 Javascript 中换行
- unity3d - Handling Coop game physics (character movement, hit...)
- java - 尝试使用 FireBase 在活动中查看“关注者”和“关注者”时出现 NullPointerException
- regex - 正则表达式匹配给定格式的字符串之外的任何字符
- strapi - Strapi:如何禁用注册?
- javascript - Cannot set property 'x' of undefined