c# xsl转换与导入在WinRT

本文关键字:WinRT 导入 xsl 转换 | 更新日期: 2023-09-27 18:15:05

我得到了一堆xsl转换文件,这些文件使用导入进行链接,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:import href="another_file.xsl"/>
   <xsl:param name="staticBaseURI" select="''"/>
   <xsl:param name="EDocsReferencedJavascript" select="0"/>
   <xsl:param name="EDocsMode" select="1"/>
</xsl:stylesheet>

在标准的。net框架中,你有XslTransform/XslCompiledTransform类,它可以接受一个文件路径,它可以处理这些导入(因为它知道路径和在哪里找到其他文件),并进行适当的转换。但是在windows通用应用程序(WinRT)这个类是不可用的,我发现的唯一一个是XsltProcessor,它需要一个普通的字符串(不是文件路径),它不能处理导入。

如何在通用app中实现这样的转换?有没有一种方法可以使用内置的WinRT类或免费的、可靠的库来做到这一点?

谢谢。

c# xsl转换与导入在WinRT

我发现的唯一一个是XsltProcessor,它接受一个普通字符串(不是文件路径)

你发现的XsltProcessor类是用于windows通用应用程序中的XsltTransform的。

但它不接受你知道的普通字符串。XsltProcessor类的构造函数接受XmlDocument作为参数。对于XmlDocument对象,您可以从文件加载,从字符串加载和从缓冲区加载。因此,您可以将文件加载到XmlDocument实例。需要注意的是,windows store应用是沙盒结构,并不是设备上的所有文件都可以访问。详细信息请参考文件访问权限。

它不能处理导入

XsltProcessor可以通过从文件中加载的XmlDocument对象来处理<import>节点。但是我们需要设置XmlLoadSettings。ResolveExternals属性设置为true,以便在解析文档时解析外部实体引用。

和样例代码如下:

 private async void btnxlsttest_Click(object sender, RoutedEventArgs e)
 {
     StorageFile xlstfile =await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/ForImports.xslt"));           
     XmlLoadSettings importsetting = new XmlLoadSettings();
     importsetting.ResolveExternals = true;            
     xsltDoc = await XmlDocument.LoadFromFileAsync(xlstfile,importsetting);
     StorageFile xmlfile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/books.xml"));         
     doc = await XmlDocument.LoadFromFileAsync(xmlfile);
     var xsltProcessor = new Windows.Data.Xml.Xsl.XsltProcessor(xsltDoc);
     String transformedStr = xsltProcessor.TransformToString(doc);
     txtshow.Text = transformedStr;        
 }

我只是把所有的测试文件放在Assets文件夹中,文件ForImports.xslt包含import节点,如下所示。这个示例可以从another_file.xslt加载模板。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:import href="another_file.xslt"/>
 <xsl:template match="/">
   <xsl:apply-imports/>
  </xsl:template>
</xsl:stylesheet>