Я пытаюсь выполнить преобразование XSLT с помощью Delphi XE8 и сталкиваюсь с проблемами. Мой XSL-файл ссылается на внешний 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.
Есть ли у кого-нибудь предложения по альтернативным способам выполнения XSLT-преобразований с помощью Delphi XE8?