Преобразование XML с xmlns в узел в другой XML с использованием XSLT [duplicate]

Это может показаться немного интуитивно понятным, но ваш класс должен заявить, что он также реализует родительский интерфейс. Ваше объявление класса должно быть таким:

TMyObj = class(TInterfacedObject, IMyBase, IMyIntf)

Дэнни Торп, бывший инженер Borland, объяснил обоснование этого поведения в ответе на соответствующий вопрос :

Если класс реализации не объявляет, что он поддерживает наследуемый интерфейс, то класс не будет присвоить совместимость с переменными унаследованного интерфейса. Выбранный вами образец кода должен работать нормально (с использованием интерфейса IChild), но если вы попытаетесь назначить из экземпляра TMyClass переменную IParent, то у вас возникнут проблемы.

Причина в том, что потому что COM и ActiveX позволяют реализации реализовать интерфейс потомства (ваш IChild), но запрещают предок этого интерфейса (IParent). Поскольку интерфейсы Delphi предназначены для совместимости с COM, вот откуда этот дурацкий артефакт.

blockquote>

0
задан hazymat 13 January 2016 в 06:01
поделиться

3 ответа

Проблема: ваш 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>
5
ответ дан michael.hor257k 28 August 2018 в 05:06
поделиться

В вашем XSL есть 2 ошибки:

  1. <xsl:value-of select="FcstPeriods/Period/Paragraph"/> никогда ничего не выберет, потому что <RegionalFcst> и все его дочерние элементы находятся в пространстве имен (xmlns="www.metoffice.gov.uk/xml/metoRegionalFcst").
  2. <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>
0
ответ дан Kim Homann 28 August 2018 в 05:06
поделиться

Ниже приведено простое изменение, необходимое для вашего xsl.

из: <xsl:value-of select="FcstPeriods/Period/Paragraph"/>

в: <xsl:value-of select="//*:FcstPeriods/*:Period/*:Paragraph"/>

0
ответ дан Rao 28 August 2018 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: