反向结构位置XSLT

时间:2018-09-07 08:03:15

标签: xml xslt xml-parsing

我想要一些技巧来完成反向结构:

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>

谢谢您的投入。

此致

1 个答案:

答案 0 :(得分: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"/>