UWP:允许WebView中的XSL转换为本地内容

时间:2016-10-21 10:03:31

标签: xml xslt webview uwp microsoft-edge

我想在WebView上显示本地XML文件。 XML文件引用本地XSL文件(在同一文件夹中)。但样式表没有应用,其原因似乎是安全问题。

如果我在Edge的控制台中打开文件我

  

XSLT8690:系统找不到指定的对象。

是否有可能允许本地文件的XSL转换(例如here)?如何显示引用样式表的本地XML文件?

2 个答案:

答案 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)

我想到了可能的选择:

浏览器方法的缺点是,所有库都已过时,现有库不支持转换的所有功能。可以找到实施herehere。还有一些jQuery包装器可用(请参阅[1][2][3])。

webview还有一个feature request

Copying the xml file to the asset folder,不起作用。此处显示空白页面。但是,如果你使用资产文件夹中的文件,它就可以使用,你在编译时就包含了这个文件。