我有一个XSL文件,除了在Delphi中,它在我尝试过的每个地方都可以正常工作。适用于Web解析器(例如https://xslttest.appspot.com/),并且在使用microsoft的msxsl.exe
时适用。
但是,在Delphi 10.2中调用transformNode()
时,以下代码给出了异常:
样式表不包含文档元素。样式表可能为空,或者可能不是格式正确的XML文档。
据我了解,这应该使用msxsl
使用的相同MSXML?
uses
Winapi.MSXML;
procedure TForm1.Button1Click(Sender: TObject);
var
transformstring: string;
xmldoc,xsldoc: ixmldomdocument3;
begin
xmldoc := CoDOMDocument60.Create;
xsldoc := CoDOMDocument60.Create;
xmldoc.load('C:\Temp\Data.xml');
xsldoc.load('C:\Temp\Stylesheet.xsl');
xsldoc.setProperty('AllowXsltScript',True);
transformstring := xmldoc.transformNode(xsldoc);
end;
XSL文件是(已最小化):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="D2DSeverityFilter">^Caution^Minor^Moderate^Severe^</xsl:param>
<xsl:param name="D2HSeverityFilter">^Extreme Caution^Contraindication^Contraindicated^</xsl:param>
<xsl:param name="DocumentationFilter">^Not Established^Limited^Good^Well Established^</xsl:param>
<xsl:output method="html" omit-xml-declaration="yes"/>
</xsl:stylesheet>
输入数据似乎不相关,但为完整起见,此空文件将起作用:
<?xml version="1.0" encoding="windows-1252"?>
<Result ></Result>
下面是固定代码,包括需要设置的其他属性。
uses
Winapi.MSXML;
procedure TForm1.Button1Click(Sender: TObject);
var
transformstring: string;
xmldoc,xsldoc: ixmldomdocument3;
begin
xmldoc := CoDOMDocument60.Create;
xsldoc := CoDOMDocument60.Create;
xmldoc.load('C:\Temp\Data.xml');
xsldoc.setProperty('AllowXsltScript',True);
xsldoc.setProperty('ProhibitDTD',False);
xsldoc.setProperty('ValidateonParse',False);
xsldoc.load('C:\Temp\Stylesheet.xsl');
transformstring := xmldoc.transformNode(xsldoc);
end;