【发布时间】:2015-12-18 07:06:48
【问题描述】:
我正在尝试使用 Delphi XE8 执行 XSLT 转换,但遇到了问题。我的 XSL 文件使用其 href 属性具有相对路径的 import 语句引用外部 XSL 文件。转换失败并出现错误“命名模板 'skrivUtDate' 未出现在样式表中。”定义“skrivUtDate”位于外部 XSL 文件中。定义如下所示:
<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);
我知道 Delphi XE7 开始与 Omni XML DOM 以及 ADOM 一起发布,但 Delphi XE8 显然没有这些。我希望使用不同的文档对象模型可以解决这个问题。
XML 非常复杂,XSL 也是如此。
是否有人对使用 Delphi XE8 执行 XSLT 转换的替代方法有任何建议?
【问题讨论】:
-
MSXML 似乎无法处理具有导入文件相对路径的几层
元素(有 3 个级别,第三级有 2 个导入,尽管这些文件是在与它们被导入的文件相同的目录中)。 DIXML 能够正确解析 XSL 文件,并且易于使用,但转换返回了 AnsiString,导致一些 Unicode 字符被破坏。我在这里发布了一个关于 DIXML 的新问题:stackoverflow.com/questions/32760579/…
标签: xml delphi xslt delphi-xe8 txmldocument