我正在尝试使用Delphi XE8执行XSLT转换,并遇到问题。我的XSL文件引用外部XSL文件,使用一个其声明href属性具有相对路径的import语句。转换失败并显示错误“命名模板'skrivUtDate'没有出现在样式表中。”定义'skrivUtDate'位于外部XSL文件中。定义如下所示:使用Delphi XE8进行XSLT转换的替代方案
<xsl:template name="skrivUtDate">
<xsl:param name="oppgittTid"/>
<xsl:if test="string-length($oppgittTid)!=0">
<xsl:value-of select="substring($oppgittTid,9,2)"/>.<xsl:value-of select="substring($oppgittTid,6,2)"/>.<xsl:value-of select="substring($oppgittTid,3,2)"/>
</xsl:if>
</xsl:template>
我已经把外部XSL文件中的相应目录(相对于原来的XSL文件),但我得到同样的错误(我也尝试过其他所有可能的目录本外部文件,但没有任何工作)。但是,我可以使用EditX XML Editor来执行转换,所以我不认为这个XSL是无效的(请注意,这个XSL文件是由第三方提供的,显然它被一些使用开发平台的人成功地使用了德尔福)。
下面是XSL文件的开头片段:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:ref="http://www.kith.no/xmlstds/henvisning/2012-02-15"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:po="http://www.kith.no/xmlstds/po/poKomponent/2009-06-30"
xmlns:fk1="http://www.kith.no/xmlstds/felleskomponent1"
exclude-result-prefixes="ref xhtml po fk1">
<xsl:import href="../../Felleskomponenter/funksjoner.xsl"/>
而且,是的,funksjoner.xsl文件是在一个名为Felleskomponenter目录。
我非常简单的测试使用类似于下面的伪代码的东西:
var
XML : IXMLDocument;
XSL : IXMLDocument;
s: WideString;
begin
XML := TXMLDocument.Create(self);
XML.FileName := 'C:\somepath\some.xml';
XML.Active := True;
XSL := TXMLDocument.Create(Self);
XSL.FileName := 'C:\someotherpath\somefile.xsl';
XSL.Active := True;
XML.DocumentElement.TransformNode(XSL.DocumentElement, s);
我知道德尔福XE7开始全方位XML DOM还有ADOM出货,但这些显然不存在从德尔福XE8 。我希望使用不同的文档对象模型可以解决这个问题。
与XSL一样,XML非常复杂。
有没有任何机构对使用Delphi XE8执行XSLT转换的替代方法有任何建议?
MSXML似乎无法处理导入文件的相对路径的多个元素层(有3个级别,第2级导入2个,尽管这些文件与文件所在的目录相同他们正在进口)。DIXML能够正确地解析XSL文件,并且它很容易使用,但是转换返回了一个AnsiString,导致一些Unicode字符被破坏。我在这里发布了一个关于DIXML的新问题:http://stackoverflow.com/questions/32760579/does-dixml-for-delphi-support-unicode-in-xstl-transformations –