Обратная позиция структуры XSLT - PullRequest
0 голосов
/ 07 сентября 2018

Мне бы хотелось несколько советов по завершению обратной структуры:

Отредактированный XML слишком велик для размещения здесь

Ввод, как вы можете видеть нижеесть Header и Body, body есть EvenList, ObjectEvent и AggregationEvent

Входной XML:

<Document>
  <Header />
<Body>
    <EventList>
        --> <ObjectEvent>
            --> <eventTime>2018-09-06T08:51:24Z</eventTime>
        --> </ObjectEvent>
        <AggregationEvent>
            <eventTime>2018-09-06T08:51:24Z</eventTime>
        </AggregationEvent>
        <AggregationEvent>
            <eventTime>2018-09-06T08:51:24Z</eventTime>
        </AggregationEvent>
        <AggregationEvent>
            <eventTime>2018-09-06T08:51:24Z</eventTime>
        </AggregationEvent>
    </EventList>
</Body>
</Document>

Ожидаемый вывод XML -Программа XSLT должна изменить положение ObjectEvent до последнего AggregationEvent.

    <Document>
  <Header />
<Body>
    <EventList>
        <AggregationEvent>
            <eventTime>2018-09-06T08:51:25Z</eventTime>
        </AggregationEvent>
        <AggregationEvent>
            <eventTime>2018-09-06T08:51:25Z</eventTime>
        </AggregationEvent>
        --> <ObjectEvent>
            --> <eventTime>2018-09-06T08:51:24Z</eventTime>
        --> </ObjectEvent>
    </EventList>
</Body>
</Document>

Начальная точка XSLT без необходимой логики:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

<xsl:template match="//AggregationEvent">
    <xsl:copy>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Спасибо завходы.

С уважением,

1 Ответ

0 голосов
/ 07 сентября 2018

Вы начали правильно, используя шаблон идентификации. То, что вы должны делать с другим шаблоном, - это сопоставить родительский элемент EventList, а затем выбрать дочерние узлы в нужном вам порядке.

Попробуйте это XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes" />

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

<xsl:template match="EventList">
    <xsl:copy>
        <xsl:apply-templates select="AggregationEvent" />
        <xsl:apply-templates select="ObjectEvent" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Обратите внимание, что если вы используете XSLT 2.0, вы можете просто сделать два xsl:apply-templates в один, выполнив следующее:

<xsl:apply-templates select="AggregationEvent, ObjectEvent" />

А если бы вы использовали XSLT 3.0, вы могли бы заменить шаблон удостоверения на этот ...

<xsl:mode on-no-match="shallow-copy"/>
...