gpt4 book ai didi

xml - 使用 Delphi XE8 进行 XSLT 转换的替代方案

转载 作者:行者123 更新时间:2023-12-03 03:28:53 26 4
gpt4 key购买 nike

我正在尝试使用 Delphi XE8 执行 XSLT 转换,但遇到了问题。我的 XSL 文件使用 import 语句引用外部 XSL 文件,其 href 属性具有相对路径。转换失败并出现错误“命名模板‘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 编辑器执行转换,因此我不认为 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 转换的替代方法有任何建议?

最佳答案

为了使 XSLT 在 Delphi 中正常工作,您需要使用 MSXML 加载 XML 和 XSL 文件。这篇文章给出了 n example on how to use MSXML with DelphiTransformNode 在底层使用 MSXML。

以下内容应该可以工作(取 from here ,不完整的片段):

var
xmlEmployees, xslStyle : IXMLDOMDocument;
begin
xmlEmployees := CoDOMDocument.Create;
xslStyle := CoDOMDocument.Create;
xmlEmployees.load('employees.xml');
xslStyle.load('empuksna.xsl');
result := xmlEmployees.transformNode(xslStyle);
end;

同样,如果您通过字符串加载 XML 和 XSL,原始位置就会丢失。大多数处理器都支持设置基本 uri,但它看起来像 IXSLProcessor没有这样的选项。

<小时/>

您还要求有替代方案。 DIXML 支持 libxslt,它在某些方面优于 MSXML(尽管不如 .NET 的 XSLT,如果您喜欢与 .NET 互操作,这是另一种选择)。 The package of DIXML demo 文件夹中附带了一堆演示和示例。

如果您可以切换到.NET,this (rather old) DrDobb's article shows how to do XSLT with .NET and Delphi并且还显示了另一种转换替代方案(尽管它假定是 Delphi 7,不确定它是否仍然适用)。

关于xml - 使用 Delphi XE8 进行 XSLT 转换的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32697647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com