4

Delphi の TXMLDocument クラスを使用し、TransformNode メソッドを使用して XSLT 変換を実行する実用的なコードがいくつかあります。

<msxml:script>しかし、XSLT Javascript 関数 (タグ)を有効にする必要があります。これは、のAllowXsltScriptプロパティIXMLDOMDocument2を true に設定する必要があることを意味します。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms760290(v=vs.85).aspx

私はこれを成功裏に達成しました - ただし、Delphi ライブラリ関数のソースCreateDOMDocumentmsxmldom.pas.

function CreateDOMDocument: IXMLDOMDocument;
var doc :IXMLDOMDocument2;
begin

  doc := TryObjectCreate([CLASS_DOMDocument60, CLASS_DOMDocument40, CLASS_DOMDocument30,
    CLASS_DOMDocument26, msxml.CLASS_DOMDocument]) as IXMLDOMDocument2;
  if not Assigned(doc) then
    raise DOMException.Create(SMSDOMNotInstalled);
  doc.setProperty('AllowXsltScript', true);  // Allow XSLT scripts!!
  Result := doc;
end;

明らかに、これは満足のいくものではありません。では、ライブラリ コードを変更せずに IXMLDOMDocument2 オブジェクトにアクセスするにはどうすればよいでしょうか?

4

2 に答える 2

4

MSXMLDOMDocumentCreate変数を介して create 関数をオーバーライドできます。

unit Unit27;

interface

uses
  xmldoc, xmlintf, msxml, msxmldom, Forms, SysUtils, 
  ActiveX, ComObj, XmlDom, XmlConst,
  Windows, Messages, Classes, Controls, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TryObjectCreate(const GuidList: array of TGuid): IUnknown;
var
  I: Integer;
  Status: HResult;
begin
  Status := S_OK;
  for I := Low(GuidList) to High(GuidList) do
  begin
    Status := CoCreateInstance(GuidList[I], nil, CLSCTX_INPROC_SERVER or
      CLSCTX_LOCAL_SERVER, IDispatch, Result);
    if Status = S_OK then Exit;
  end;
  OleCheck(Status);
end;

function CreateDOMDocument2: IXMLDOMDocument;

var
  Doc2 : IXMLDOMDocument2;

begin
  Doc2 := TryObjectCreate([CLASS_DOMDocument60, CLASS_DOMDocument40, CLASS_DOMDocument30,
    CLASS_DOMDocument26, msxml.CLASS_DOMDocument]) as IXMLDOMDocument2;
  if not Assigned(Doc2) then
    raise DOMException.Create(SMSDOMNotInstalled);
  Doc2.setProperty('AllowXsltScript', true);
  Result := Doc2;
end;


procedure TForm1.FormCreate(Sender: TObject);

var
 Doc : IXMLDocument;

begin
 Doc := TXMLDocument.Create(nil);
 Doc.LoadFromFile('c:\temp\test.xml');
end;


initialization
 MSXMLDOMDocumentCreate := CreateDOMDocument2;
end.
于 2013-06-17T09:55:24.173 に答える