Это может показаться немного интуитивно понятным, но ваш класс должен заявить, что он также реализует родительский интерфейс. Ваше объявление класса должно быть таким:
TMyObj = class(TInterfacedObject, IMyBase, IMyIntf)
Дэнни Торп, бывший инженер Borland, объяснил обоснование этого поведения в ответе на соответствующий вопрос :
Если класс реализации не объявляет, что он поддерживает наследуемый интерфейс, то класс не будет присвоить совместимость с переменными унаследованного интерфейса. Выбранный вами образец кода должен работать нормально (с использованием интерфейса IChild), но если вы попытаетесь назначить из экземпляра TMyClass переменную IParent, то у вас возникнут проблемы.
Причина в том, что потому что COM и ActiveX позволяют реализации реализовать интерфейс потомства (ваш IChild), но запрещают предок этого интерфейса (IParent). Поскольку интерфейсы Delphi предназначены для совместимости с COM, вот откуда этот дурацкий артефакт.
blockquote>
Проблема: ваш XML помещает свои элементы в пространство имен .
Решение: объявить одно и то же пространство имен в таблице стилей, назначить ему префикс и использовать этот префикс для адресации элементов в исходном XML:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:met="www.metoffice.gov.uk/xml/metoRegionalFcst"
exclude-result-prefixes="met">
<xsl:template match="/">
<html>
<body>
<xsl:value-of select="met:RegionalFcst/met:FcstPeriods/met:Period/met:Paragraph[@title='Headline:']"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
В вашем XSL есть 2 ошибки:
<xsl:value-of select="FcstPeriods/Period/Paragraph"/>
никогда ничего не выберет, потому что <RegionalFcst>
и все его дочерние элементы находятся в пространстве имен (xmlns="www.metoffice.gov.uk/xml/metoRegionalFcst"
). <xsl:template match="/">
не будет соответствовать <RegionalFcst>
, но он будет соответствовать его родительскому элементу (невидимому). <RegionalFcst>
- это первый и единственный дочерний элемент /
. Чтобы ваш XSL работал правильно, он должен выглядеть следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:value-of select="*[local-name()='RegionalFcst']/*[local-name()='FcstPeriods']/*[local-name()='Period']/*[local-name()='Paragraph']"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Ниже приведено простое изменение, необходимое для вашего xsl.
из: <xsl:value-of select="FcstPeriods/Period/Paragraph"/>
в: <xsl:value-of select="//*:FcstPeriods/*:Period/*:Paragraph"/>