使用 C# 转换时忽略 XSLT 中的 FileNotFound API
Ignore FileNotFound in XSLT when transforming with C# API
我正在努力解决以下问题:我有一个(外部提供的!)XSLT,我正试图用它来显示一些数据。
XSLT 引用了一个可选的其他 XML 文件。 IE。涉及两个 XML,其中一个显然是强制性的,但另一个很可能不存在。
XSLT 通过一个变量引用 XML,该变量使用本地路径访问文档:
<xsl:variable name="optionalDocument" select="document('../optionalXml.xml')"/>
在 XSLT 的某些地方,会像这样检查该文档是否存在:
<xsl:when test="not($optionalDocument)">
我现在面临的问题是:任何现代浏览器都可以处理这个丢失的可选文件。控制台确实显示错误,但 XSLT 正在生成有效且可显示的 html。一切都按预期工作。
现在我正在尝试构建一个服务,它执行相同的操作并使用 XSLT 转换 XMLs 并生成一个可显示的 html。为此,我将 C# 与 System.Xml.Xsl.XslCompiledTransform
一起使用,如果两个文件都可用,它就可以正常工作。但是,如果缺少可选文件,则转换方法会抛出一个 FileNotFoundException,这是有道理的,但这实际上会阻止生成预期的 html 文件。
有没有办法使 XslCompiledTransform 的行为方式与浏览器的行为方式相同,从而能够处理可选文档?如果没有,是否有一个巧妙的解决方案来调整 XSLT 文件以仅在设置了某个参数时加载文件,否则将其保留为“null”或 document($path)
函数 returns 如果文件不存在。
感谢任何建议!
马丁的回答是正确的。我重新发布它以将此问题标记为已回答。可以在 API 中提供您自己的 XmlResolver,在加载样式表时也可以像这样调用转换:
xslt.Load(styleSheetPath, settings, new SilentLocalFileXmlResolver());
xslt.Transform(xmlReader, argsList, resultXmlWriter, new SilentLocalFileXmlResolver());
请注意,每个调用都有各自的解析器,这是我一开始错过的!
提供一个不抛出异常的解析器就足够了。在我的例子中,如果传递的 Uri 是一个文件路径并且不存在,我 return null 否则重定向到“默认”XmlUrlResolver。
我正在努力解决以下问题:我有一个(外部提供的!)XSLT,我正试图用它来显示一些数据。 XSLT 引用了一个可选的其他 XML 文件。 IE。涉及两个 XML,其中一个显然是强制性的,但另一个很可能不存在。 XSLT 通过一个变量引用 XML,该变量使用本地路径访问文档:
<xsl:variable name="optionalDocument" select="document('../optionalXml.xml')"/>
在 XSLT 的某些地方,会像这样检查该文档是否存在:
<xsl:when test="not($optionalDocument)">
我现在面临的问题是:任何现代浏览器都可以处理这个丢失的可选文件。控制台确实显示错误,但 XSLT 正在生成有效且可显示的 html。一切都按预期工作。
现在我正在尝试构建一个服务,它执行相同的操作并使用 XSLT 转换 XMLs 并生成一个可显示的 html。为此,我将 C# 与 System.Xml.Xsl.XslCompiledTransform
一起使用,如果两个文件都可用,它就可以正常工作。但是,如果缺少可选文件,则转换方法会抛出一个 FileNotFoundException,这是有道理的,但这实际上会阻止生成预期的 html 文件。
有没有办法使 XslCompiledTransform 的行为方式与浏览器的行为方式相同,从而能够处理可选文档?如果没有,是否有一个巧妙的解决方案来调整 XSLT 文件以仅在设置了某个参数时加载文件,否则将其保留为“null”或 document($path)
函数 returns 如果文件不存在。
感谢任何建议!
马丁的回答是正确的。我重新发布它以将此问题标记为已回答。可以在 API 中提供您自己的 XmlResolver,在加载样式表时也可以像这样调用转换:
xslt.Load(styleSheetPath, settings, new SilentLocalFileXmlResolver());
xslt.Transform(xmlReader, argsList, resultXmlWriter, new SilentLocalFileXmlResolver());
请注意,每个调用都有各自的解析器,这是我一开始错过的! 提供一个不抛出异常的解析器就足够了。在我的例子中,如果传递的 Uri 是一个文件路径并且不存在,我 return null 否则重定向到“默认”XmlUrlResolver。