IXSLTemplate (MSXML 6) — как разрешить xsl:import

Я использую mxsml 6 через COM для выполнения преобразования. В исходной таблице стилей есть оператор xs:import, который я знаю, как включить, но как я могу заставить MSXML сделать это? Кажется, я не могу найти место, где можно указать IXSLTemplate загрузить разрешенный источник

Подробности:

  • Я получаю сообщение об ошибке "Система не может найти указанный объект"
  • Я устанавливаю ResolveExternals = true в исходном документе.
  • Я пытаюсь выполнить проверку схематрона
  • Я использую Delphi, поэтому использование msxml кажется моим единственным вариантом.
  • У меня все в памяти в серверной среде, поэтому я очень хочу избежать использования файлов

Код:

var
  v: variant;
  doc : IXMLDOMDocument2;
  xform: IXSLTemplate;
begin
  v := CreateOLEObject('MSXML2.FreeThreadedDOMDocument.6.0')
  doc := IUnknown(TVarData(v).VDispatch) as IXMLDomDocument2;
  doc.async := false;
  doc.resolveExternals := true;
  doc.loadXML([my source for the first transform below]);
  v := CreateOLEObject('MSXML2.XSLTemplate.6.0');
  xform := IUnknown(TVarData(v).VDispatch) as IXSLTemplate;
  xform.stylesheet := doc;
end;

исходный источник для преобразований:


person Grahame Grieve    schedule 09.06.2013    source источник
comment
хорошо, даже если эту проблему можно решить - что выглядит маловероятным - это все равно не xslt 2. Элемент управления Altova XML намного проще в использовании (хотя есть та же проблема - нужно использовать файлы)   -  person Grahame Grieve    schedule 10.06.2013
comment
Вас может заинтересовать этот вопрос: stackoverflow.com/questions/8991755/ (хотя это вопрос .Net.)   -  person Baoquan Zuo    schedule 11.06.2013
comment
нет. только .net имеет решение для этого   -  person Grahame Grieve    schedule 03.02.2015


Ответы (1)


Я не программист Delphi, но я часто делал это с C++ для MSXML4. Вот пример кода vb из документации MSXML4, который я просто перевел на C++.

 Dim xslt As New Msxml2.XSLTemplate40
 Dim xslDoc As New Msxml2.FreeThreadedDOMDocument40
 Dim xmlDoc As New Msxml2.DOMDocument40
 Dim xslProc As IXSLProcessor
 xslDoc.async = False
 xslDoc.Load "sample.xsl"
 Set xslt.stylesheet = xslDoc
 xmlDoc.async = False
 xmlDoc.Load "books.xml"
 Set xslProc = xslt.createProcessor()
 xslProc.input = xmlDoc
 xslProc.addParameter "param1", "Hello"
 xslProc.Transform
 MsgBox xslProc.output
person Jim    schedule 19.08.2013