2016-02-11 3 views
2

Я пытаюсь вставить некоторые узлы XML (плюс дочерние узлы) в преобразованный документ XSLT. У меня XML как строка, и поэтому сначала я передал эту строку и просто распечатал ее. Однако все < s и > s были экранированы как &lt; и &gt;, поэтому я понял, что анализатор XML будет игнорировать эти и не распознавать строку как узлы XML.C# Передача XML в качестве параметра XSLT

Я попытался сначала записать строку в файл, а затем загрузить ее с помощью функции document(). Однако это привело к ошибке: Resolving of external URIs was prohibited. Я также понял, что из-за чувствительной природы преобразованных документов это может представлять серьезный риск, так как любой может написать файл с тем, что им нравится в этом месте, и его потенциально можно было бы подобрать и вставлен в выходной XML.

Итак, я попытался передать XML в качестве URI с добавленным data:text/xml, поскольку функция документа должна анализировать и загружать URI такого типа. Тем не менее, это привело к той же ошибке: Resolving of external URIs was prohibited.

Объект, созданный мной, правильно создается, насколько мне известно. В настройках 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. Есть ли способ сделать это?

+1

Относительно «Разрешение внешних URI было запрещено», см. Http://stackoverflow.com/questions/32439036/xslloadexception-resolving-of-external-uris-was-prohibited. Для остальных, пожалуйста, создайте минимальный, самодостаточный код исполняемого кода вместе с ожидаемым результатом. Существует несколько способов получить новые узлы в XML-документе, ['ImportNode()'] (https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.importnode (v = vs.110)) .aspx) является одним из них. Почему это должен быть XSLT? – Tomalak

+0

@ Томалак Я уже видел этот вопрос. Отчасти то, как я попал в ситуацию, в которой я сейчас живу. – Luke

+0

... и другие вещи в моем комментарии? – Tomalak

ответ

4

Использование, например.

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

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

с C#, а затем <xsl:param name="param1" select="/.."/> в XSLT объявить параметр и инициализировать его как набор пустой узел, то вы можете использовать <xsl:copy-of select="$param1"/> скопировать XML в результате, когда вы хотите, чтобы вставить его.

Вместо XPathDocument вы также можете использовать XmlDocument или XDocument я думаю, что (возможно, потребуется явно вызывать CreateNavigator() и последнего).

Смежные вопросы