反向结构位置XSLT

问题描述 投票:0回答:1

我想要一些提示来完成反向结构:

编辑XML它太大了,不能在这里发布

如下所示输入有HeaderBodybodyEvenListObjectEventAggregationEvent

输入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>

感谢您的投入。

问候,

xml xslt xml-parsing
1个回答
0
投票

您通过使用身份模板以正确的方式开始。你应该在另一个模板上做什么,但在父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"/>
© www.soinside.com 2019 - 2024. All rights reserved.