[英]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 Framework中,您具有XslTransform / XslCompiledTransform類,該類可以采用文件路徑,它可以處理那些導入(因為它知道路徑以及在何處可以找到其他文件)並進行適當的轉換。 但是在Windows通用應用程序(WinRT)中,該類不可用,我發現的唯一一個是XsltProcessor,它采用純字符串(不是文件路徑)並且不能處理導入。
如何在通用應用中進行此類轉換? 有沒有辦法使用內置的WinRT類或免費,可靠的庫來做到這一點?
謝謝。
我發現的唯一一個是XsltProcessor,它采用純字符串(不是文件路徑)
您找到的XsltProcessor類適用於Windows通用應用程序中的XsltTransform
。
但這並不需要您所知道的簡單字符串。 XsltProcessor
類的構造函數接受XmlDocument作為參數。 對於XmlDocument
對象,您可以從文件 加載,從字符串 加載和從buffer加載 。 因此,您可以將文件加載到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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.