带有相对URI的XSLT文档函数,允许使用http或https

时间:2011-08-15 22:17:18

标签: c# xslt

这是一个两部分问题:

1)我正在使用XSLT文档函数在转换期间从REST端点获取XML。如果我明确地将方案添加到uri,即document('http://...'),这可以正常工作。但是,我正在处理的网站的最终版本可能会安全地访问,也可能不会安全访问(https)。为了弥补这一点,是否可以像在图像等其他资源中那样在XSLT文档函数中使用相对URI,即document('//...')

我正在尝试使用本机.NET XsltCompiledTransform执行此操作并收到以下错误:"Invalid URI: The hostname could not be parsed."这是.NET中的限制,可以使用Saxon或其他2.0处理器实现,还是只是没有可能的?

更新

抛出的异常是XsltTransformException,内部UriFormatException具有以下堆栈跟踪:

at System.Xml.Xsl.Runtime.XmlQueryContext.GetDataSource(String uriRelative, String uriBase)
at <xsl:template match="Nomination">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
at <xsl:template match="/">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results, XmlResolver documentResolver)
at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results)
at AAFC.Web.XsltView.Render(ViewContext viewContext, TextWriter writer)

内部堆栈跟踪:

at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
at System.Uri.CreateUri(Uri baseUri, String relativeUri, Boolean dontEscape)
at System.Uri..ctor(Uri baseUri, String relativeUri)
at System.Xml.XmlResolver.ResolveUri(Uri baseUri, String relativeUri)
at System.Xml.XmlUrlResolver.ResolveUri(Uri baseUri, String relativeUri)
at System.Xml.Xsl.Runtime.XmlQueryContext.GetDataSource(String uriRelative, String uriBase)

2)我关注的是(我没有对此进行过测试,因此可能没有实际意义),如果安全访问最终站点(https)并且转换引用了不安全的REST端点(http)可能会出现问题。这是一个有效的问题,还是会发生转变?

1 个答案:

答案 0 :(得分:1)

我在Powershell上测试过,URI解析工作正常:

PS C:\> $u = new-object Uri (new-object Uri "https://a.com"), "//b.com/"
PS C:\> $u.AbsoluteUri
https://b.com/

如果您使用相对URI作为文档函数的参数,则使用样式表模块的静态基URI解析,该静态基本URI可以使用接受Load overloadXmlReader进行自定义实例,并使用接受baseUri参数的Create overloads之一。