我想在WebView
上显示本地XML文件。 XML文件引用本地XSL文件(在同一文件夹中)。但样式表没有应用,其原因似乎是安全问题。
如果我在Edge的控制台中打开文件我
XSLT8690:系统找不到指定的对象。
是否有可能允许本地文件的XSL转换(例如here)?如何显示引用样式表的本地XML文件?
答案 0 :(得分:1)
如果您的XML和XSL文件不在应用程序的assets文件夹中,则将WebView.Navigate方法或WebView.Source属性设置为XML文件将不起作用。要解决此问题,我们可以先使用XsltProcessor class根据xslt文件中指定的样式表声明转换xml,然后使用WebView.NavigateToString方法加载转换后的HTML内容。
例如:
var xmlFile = await ApplicationData.Current.LocalCacheFolder.GetFileAsync("test.xml");
var xsltFile = await ApplicationData.Current.LocalCacheFolder.GetFileAsync("test.xsl");
var doc = await Windows.Data.Xml.Dom.XmlDocument.LoadFromFileAsync(xmlFile);
var xsltDoc = await Windows.Data.Xml.Dom.XmlDocument.LoadFromFileAsync(xsltFile);
// Transform xml according to the style sheet declaration specified in xslt file
var xsltProcessor = new Windows.Data.Xml.Xsl.XsltProcessor(xsltDoc);
var transformedStr = xsltProcessor.TransformToString(doc);
//MyWebView is the WebView control in XAML
MyWebView.NavigateToString(transformedStr);
<强>更新强>
我得到错误HRESULT E_FAIL已从调用COM组件返回。在Windows.Data.Xml.Xsl.XsltProcessor.TransformToString(IXmlNod e inputNode)。
这里的问题是,在您的示例的XSL文件中,它使用的是XSLT document()
函数。但出于安全原因,UWP中禁止执行document()
功能。因此,在执行XsltProcessor.TransformToString
方法时会出现错误。
对于经典的.NET Framework应用程序,我们可以设置XsltSettings.EnableDocumentFunction Property以启用对XSLT document()
函数的支持。但是UWP中没有这样的类或属性。欢迎您通过UserVoice提交此功能的请求。
对于您的特定XSL文件,它仅在两个地方使用document()
函数:
<xsl:if test="$useexternalcss=1">
<style type="text/css" media="screen">
<xsl:value-of select="document($externalcssname)" />
</style>
</xsl:if>
...
<p class="subtitle_create">
<xsl:text>Angezeigt mit </xsl:text>
<xsl:value-of select="document('')/xsl:stylesheet/@id" />
</p>
首先,因为它没有使用外部css,所以document()
函数将不会执行。我们可以忽略它或肯定地评论它。在第二位,document()
函数用于获取stylesheet
的{{1}} “ELGA_Referenzstylesheet_1.04.009.1”,我认为此值是一个常数。如果样式表没有改变,它不会改变。所以我认为你可以改变它如下:
id
在此之后,您可以使用<p class="subtitle_create">
<xsl:text>Angezeigt mit </xsl:text>
<xsl:text>ELGA_Referenzstylesheet_1.04.009.1</xsl:text>
</p>
方法重试,它应该能够正常工作。
答案 1 :(得分:0)
我想到了可能的选择:
浏览器方法的缺点是,所有库都已过时,现有库不支持转换的所有功能。可以找到实施here和here。还有一些jQuery包装器可用(请参阅[1],[2]或[3])。
webview还有一个feature request。
Copying the xml file to the asset folder,不起作用。此处显示空白页面。但是,如果你使用资产文件夹中的文件,它就可以使用,你在编译时就包含了这个文件。