我正在尝试将一些XML节点(加上子节点)插入到XSLT转换的文档中。我把XML作为一个字符串,所以起初我把这个字符串传入并简单地打印出来。但是,所有<
和>
都被转义为<
和>
,因此我意识到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。有没有办法做到这一点?
答案 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复制到要插入的结果中
您可以使用XPathDocument
或XmlDocument
而不是XDocument
,我认为(可能需要明确调用CreateNavigator()
和后者)。