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类或免费的、可靠的库来做到这一点?
谢谢。
我发现的唯一一个是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>