C#将XML作为参数传递给XSLT

时间:2016-02-11 14:27:11

标签: c# xml xslt

我正在尝试将一些XML节点(加上子节点)插入到XSLT转换的文档中。我把XML作为一个字符串,所以起初我把这个字符串传入并简单地打印出来。但是,所有<>都被转义为&lt;&gt;,因此我意识到XML解析器会忽略这些并且不会将字符串识别为XML节点。

我首先尝试将字符串写入文件,然后使用document()函数加载它。然而,这导致了错误:Resolving of external URIs was prohibited.我也意识到由于文档的敏感性正在被转换,这可能会带来严重的风险,因为任何人都可以写一个文件,包含他们喜欢的任何位置,它会可能会被选中并插入到输出XML中。

所以,我尝试将XML作为附加data:text/xml的URI传递给它,因为文档函数应该能够解析和加载这种类型的URI。但是,这导致了同样的错误:Resolving of external URIs was prohibited.

据我所知,我的XslCompiledTransform对象正在被正确实例化。 XsltSettings设置为允许使用document()函数,并且我已经传入了XmlUrlResolver对象。

            var xslt = new XslCompiledTransform(true);

            var resolver = new XmlUrlResolver();
#if DEBUG
            xslt.Load(Location, new XsltSettings(true, true), resolver);
#else
            xslt.Load(XmlReader.Create(new StringReader(this.Text)), new XsltSettings(true, true), resolver);
#endif

我在这里有些不知所措。实际上,理想情况是有一种方法来传入字符串并告诉转换处理器不要逃避<> s。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:4)

使用例如

XPathDocument doc = new XPathDocument(new StringReader(stringWithXml));
XsltArgumentList xsltArgs = new XsltArgumentList();
xsltArgs.AddParameter("param1", "", doc);

...
xslt.Transform(input, xsltArgs, output);

使用C#,然后在XSLT中使用<xsl:param name="param1" select="/.."/>来声明参数并将其初始化为空节点集,然后您可以使用<xsl:copy-of select="$param1"/>将XML复制到要插入的结果中

您可以使用XPathDocumentXmlDocument而不是XDocument,我认为(可能需要明确调用CreateNavigator()和后者)。