【问题标题】:C# Passing XML as Parameter to XSLTC# 将 XML 作为参数传递给 XSLT
【发布时间】:2016-02-11 14:27:11
【问题描述】:

我正在尝试将一些 XML 节点(加上子节点)插入到经过 XSLT 转换的文档中。我将 XML 作为字符串,所以起初我将这个字符串传入并简单地打印它。但是,所有<s 和>s 都被转义为<>,所以我意识到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 和>s。有没有办法做到这一点?

【问题讨论】:

  • 关于“禁止解析外部 URI”,请参阅 stackoverflow.com/questions/32439036/…。对于其余部分,请构建一个最小的、独立的可运行代码示例以及预期的输出。有几种方法可以将新节点放入 XML 文档,ImportNode() 就是其中之一。为什么必须是 XSLT?
  • @Tomalak 我已经看到了这个问题。部分原因是我现在所处的情况。
  • ...以及我评论中的其他内容?

标签: c# xml xslt


【解决方案1】:

使用例如

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复制到你想要插入的结果中。

我认为您也可以使用XmlDocumentXDocument 而不是XPathDocument(可能需要显式调用CreateNavigator() 和后者)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2012-11-03
    • 2012-01-18
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多