在 WinRT 上使用导入的 C# xsl 转换
C# xsl transform with imports on WinRT
我有一堆 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 class 可以采用文件路径,它可以处理这些导入(因为它知道路径以及在哪里可以找到其他文件)并执行适当的改造。但是在 windows 通用应用程序 (WinRT) 中,此 class 不可用,我发现的唯一一个是 XsltProcessor,它采用纯字符串(不是文件路径)并且无法处理导入。
如何在通用应用程序中进行此类转换?有没有一种方法可以使用内置的 WinRT classes 或免费、可靠的库来做到这一点?
谢谢。
the only one I found is XsltProcessor which takes a plain string (not file path)
XsltProcessor class 您在 windows 通用应用程序中找到 XsltTransform
。
但它并不像您所知的那样采用纯字符串。 constructor of the XsltProcessor
class accept a XmlDocument as parameter. For XmlDocument
object, you can load from file, load from string and load from buffer. So you can load file to the XmlDocument
instance. Which we need pay attention is that windows store app is sandbox structure, not all the files on the device you can visit. More details please reference File access permissions.
it can't handle imports
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>
我有一堆 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 class 可以采用文件路径,它可以处理这些导入(因为它知道路径以及在哪里可以找到其他文件)并执行适当的改造。但是在 windows 通用应用程序 (WinRT) 中,此 class 不可用,我发现的唯一一个是 XsltProcessor,它采用纯字符串(不是文件路径)并且无法处理导入。
如何在通用应用程序中进行此类转换?有没有一种方法可以使用内置的 WinRT classes 或免费、可靠的库来做到这一点?
谢谢。
the only one I found is XsltProcessor which takes a plain string (not file path)
XsltProcessor class 您在 windows 通用应用程序中找到 XsltTransform
。
但它并不像您所知的那样采用纯字符串。 constructor of the XsltProcessor
class accept a XmlDocument as parameter. For XmlDocument
object, you can load from file, load from string and load from buffer. So you can load file to the XmlDocument
instance. Which we need pay attention is that windows store app is sandbox structure, not all the files on the device you can visit. More details please reference File access permissions.
it can't handle imports
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>